{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f6c85fc5-9435-4201-9d21-6a17513880d3",
   "metadata": {
    "tags": []
   },
   "source": [
    "# Welcome to GoNB\n",
    "\n",
    "[*GoNB*](https://github.com/janpfeifer/gonb) is a *Go* notebook kernel. It allows one to easily run *Go* code in a *Jupyter Notebook* and variations.\n",
    "\n",
    "In this tutorial we will walk through most of its features, and explain how it works.\n",
    "\n",
    "See the [README.md's Installation section](https://github.com/janpfeifer/gonb#installation). It also includes a Docker with Jupyter+GoNB pre-installed, that makes it trivial.\n",
    "\n",
    "## Hello World!\n",
    "\n",
    "Whenever a cell is executed, *gonb* saves the cell content of the cell to a *Go* file, auto-imports missing dependencies (when it can guess), compiles and runs it. It may seem a lot, but its pretty fast (except\n",
    "maybe the first cell run that is usually a little slower) and feels interactive. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "430b4b44-0012-4086-8460-5ba81d20a699",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello World!"
     ]
    }
   ],
   "source": [
    "func main() {\n",
    "    fmt.Printf(\"Hello World!\")\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a936cc25-a399-43d8-8590-4bbf116a9c15",
   "metadata": {},
   "source": [
    "Easy, right ? Now when trying different things, to avoid having to write `func main()` at every cell, *gonb* provides a short cut: \"%%\". Anything after a \"%%\" will be wrapped inside a `func main() { ... }`.\n",
    "\n",
    "So, let's redo our example above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "781a15d2-469e-4c93-b45e-c18067787f97",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello World!"
     ]
    }
   ],
   "source": [
    "%%\n",
    "fmt.Printf(\"Hello World!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1917b045-6b6a-47bb-a9ed-dfac8fecaca7",
   "metadata": {},
   "source": [
    "## Globals and Updates\n",
    "\n",
    "Imports, functions, constants, types and variables global declarations are memorized once executed, and carry over from one cell to another.\n",
    "\n",
    "So one can work on different functions let's say on different cells.\n",
    "\n",
    "Let's test it out:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1c73bb12-8e2e-49a8-ae72-60d2c022e25f",
   "metadata": {},
   "outputs": [],
   "source": [
    "func incr[T interface{constraints.Float|constraints.Integer}](x T) T {\n",
    "    return x+T(1)\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "35bb337a-1a73-4d0d-a411-3eec6c1e8507",
   "metadata": {},
   "source": [
    "Ok, now we have `incr` defined to any numeric type, we can use it in all our future cells.\n",
    "\n",
    "Some quick tests:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d1414e76-3fa9-4046-827b-e449cc638e81",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "incr: x=2, y=4.141593\n"
     ]
    }
   ],
   "source": [
    "%%\n",
    "x := incr(1)\n",
    "y := incr(math.Pi)\n",
    "fmt.Printf(\"incr: x=%d, y=%f\\n\", x, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7c1b28f7-b36f-4ec3-9239-99f8352c01fb",
   "metadata": {},
   "source": [
    "> **Note**: Only the various declarations are carried over from one cell to another, not the results of the execution, including updates to variables.\n",
    "> \n",
    "> So for instance, if we initialize a variable `startValue` with 1, then increment it in one cell. Next time we execute a new cell, it will be again initialized to 1. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5549f231-4061-4ec7-9e1c-8ae56c7c82d7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "current startValue=2.000000\n"
     ]
    }
   ],
   "source": [
    "var startValue = float32(1)\n",
    "\n",
    "%%\n",
    "startValue = incr(startValue)\n",
    "fmt.Printf(\"current startValue=%f\\n\", startValue)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "df2be63f-991f-4c4d-acf3-d705fa2b6d96",
   "metadata": {},
   "source": [
    "Now if we execute again, `startValue` is again initialized to 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2111a24e-2627-463a-b936-d8476ba69005",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "current startValue=1.000000\n"
     ]
    }
   ],
   "source": [
    "%%\n",
    "fmt.Printf(\"current startValue=%f\\n\", startValue)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4fc0797-df7f-4652-8a22-e8b489580e1d",
   "metadata": {},
   "source": [
    "If one wants to save results calculated from one cell to another, GoNB includes the `github.com/janpfeifer/gonb/cache` package that makes it trivial to save and load previously generated results.\n",
    "\n",
    "**Example**: Below `VeryExpensive` is only called once for `CachedValue`, so you will notice that if you run the cell multiple times, it will display always the same number, while `NonCachedValue` will always call `VeryExpensive` again, and display another number. So the string \"...calculating...\" is printed twice only the first time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d59e0cbd-0d2a-42e5-8f94-29936130f437",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\t...VeryExpensive() call...\n",
      "NonCachedValue=501\n",
      "   CachedValue=993\n"
     ]
    }
   ],
   "source": [
    "// Temporary fix until new release v0.6.0 propagates.\n",
    "import (\n",
    "    \"math/rand\"\n",
    "    \"github.com/janpfeifer/gonb/cache\"\n",
    ")\n",
    "\n",
    "func VeryExpensive() int {\n",
    "    fmt.Println(\"\\t...VeryExpensive() call...\")\n",
    "    return rand.Intn(1000)\n",
    "}\n",
    "\n",
    "var (\n",
    "    CachedValue = cache.Cache(\"expensive\", VeryExpensive)\n",
    "    NonCachedValue = VeryExpensive()\n",
    ")\n",
    "    \n",
    "%%\n",
    "fmt.Printf(\"NonCachedValue=%d\\n\", NonCachedValue)\n",
    "fmt.Printf(\"   CachedValue=%d\\n\", CachedValue)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5a5470b4-43ea-47ae-a111-63ab77376bd0",
   "metadata": {},
   "source": [
    "The `cache` package has many more features, check out [its documentation](https://pkg.go.dev/github.com/janpfeifer/gonb/cache).\n",
    "\n",
    "Now, we don't want to have `NonCachedValue` execute `VeryExpensive` at every cell, so let's remove its definition.\n",
    "See how to manage memorized definitions using `%help`, in the \"Managing Memorized Definitions\" section, it's displayed at the end of the tutorial."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "892deacf-a02c-4979-827c-59dedfdc0564",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ". removed var NonCachedValue\n",
      ". removed var CachedValue\n"
     ]
    }
   ],
   "source": [
    "%rm NonCachedValue CachedValue"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83c85334-6323-4b75-b9a2-184c0d83ed1c",
   "metadata": {},
   "source": [
    "## Imports\n",
    "\n",
    "A few things to remember from imports in *gonb*:\n",
    "\n",
    "* Like all other global declarations, they are memorized and carry over from one cell to the other. Still it's good practice to have each cell import what it needs -- no harm in importing the same thing multiple times.\n",
    "* *gonb* runs *goimports* before compiling the code: that means it will be able to automatically add import statements for builtin packages (in the examples above we never wrote `import \"fmt\"`, and it just worked).\n",
    "* *gonb* runs `go get` before compiling the code. This automatically fetches an external import dependency. That is convenient in most cases, but in case you want to get an external *Go* module at an specific version, you can do it manually with something like `!*go get <github.com/user/my_go_module>@<my_version>`. See below on running shell commands.\n",
    "\n",
    "Let's create a simple example that imports a delighful progress-bar library. Notice it automatically fetches the lastest version of the library `github.com/schollz/progressbar/v3` -- and the execution of the cell the first time may take a few seconds because of that.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "cbfa0e91-0209-48f5-962e-fc43dbc6b5bb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 100% |████████████████████████████████████████| (25 steps/s) [3s:0s]:0s]\n",
      "Done\n"
     ]
    }
   ],
   "source": [
    "import progressbar \"github.com/schollz/progressbar/v3\"\n",
    "\n",
    "%%\n",
    "bar := progressbar.NewOptions(100, \n",
    "                              progressbar.OptionUseANSICodes(true),\n",
    "                              progressbar.OptionShowIts(),\n",
    "                              progressbar.OptionSetItsString(\"steps\"))\n",
    "for i := 0; i < 100; i++ {\n",
    "    bar.Add(1)\n",
    "    time.Sleep(40 * time.Millisecond)\n",
    "}\n",
    "fmt.Printf(\"\\nDone\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "452a879c-f36a-4c77-8c72-7daeeee6c319",
   "metadata": {},
   "source": [
    "## Displaying HTML, Image and others\n",
    "\n",
    "One of the things that makes working in Notebooks better than using a terminal is that one can display rich content, like dynamically generated images, plots, HTML, even videos and sound.\n",
    "\n",
    "We'll follow with a few examples of what is already supported.\n",
    "\n",
    "### Improved Hello World!\n",
    "\n",
    "*gonb* includes the accompanying library *gonbUI* that handles the interfacing to the Notebook through a very simple API:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "48c217c5-6712-496e-8281-1179a487ad08",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"background:pink; color:#111; border-radius: 3px; border: 3px solid orange; font-size: 18px;\">I 🧡 GoNB!</span>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import \"github.com/janpfeifer/gonb/gonbui\"\n",
    "\n",
    "%%\n",
    "gonbui.DisplayHtml(`<span style=\"background:pink; color:#111; border-radius: 3px; border: 3px solid orange; font-size: 18px;\">I 🧡 GoNB!</span>`)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31d7080f-d94d-4e2d-92d8-e8173244c21c",
   "metadata": {},
   "source": [
    "### Markdown\n",
    "\n",
    "Markdown output is also supported -- and used for the `%help` command, see the bottom of the tutorial.\n",
    "\n",
    "This also renders math formulas using latex, use `$x^2$` for formulas inlined in text, or\n",
    "`$$x^2$$` for formulas in their own line.\n",
    "\n",
    "Example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9b76a18c-faa8-449e-b56a-8453de99dbc3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/markdown": [
       "#### Objective\n",
       "\n",
       "1. Have fun coding **Go**;\n",
       "1. Profit...\n",
       "$$f(x) = \\int_{-\\infty}^{\\infty} e^{-x^2} dx$$"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%\n",
    "gonbui.DisplayMarkdown(\"#### Objective\\n\\n1. Have fun coding **Go**;\\n1. Profit...\\n\"+\n",
    "                       `$$f(x) = \\int_{-\\infty}^{\\infty} e^{-x^2} dx$$`)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78f82dcb-3bf4-4c43-8f41-3b8dc3fe3461",
   "metadata": {},
   "source": [
    "### Fractals\n",
    "\n",
    "Let's draw a fractal, using another fun package: [github.com/benc-uk/gofract](\"github.com/benc-uk/gofract\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e5f298cd-a260-493c-9c59-dd3d79706116",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lastRenderTime=0.828705\n"
     ]
    },
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import \"github.com/benc-uk/gofract/pkg/fractals\"\n",
    "import \"github.com/benc-uk/gofract/pkg/colors\"\n",
    "\n",
    "%%\n",
    "imgWidth := 320\n",
    "\n",
    "// Default fractal\n",
    "f := fractals.Fractal{\n",
    "    FractType:    \"mandelbrot\",\n",
    "    Center:       fractals.ComplexPair{-0.6, 0.0},\n",
    "    MagFactor:    1.0,\n",
    "    MaxIter:      90,\n",
    "    W:            3.0,\n",
    "    H:            2.0,\n",
    "    ImgWidth:     imgWidth,\n",
    "    JuliaSeed:    fractals.ComplexPair{0.355, 0.355},\n",
    "    InnerColor:   \"#000000\",\n",
    "    FullScreen:   false,\n",
    "    ColorRepeats: 2,\n",
    "}\n",
    "gradient := colors.GradientTable{}\n",
    "gradient.AddToTable(\"#000762\", 0.0)\n",
    "gradient.AddToTable(\"#0B48C3\", 0.2)\n",
    "gradient.AddToTable(\"#ffffff\", 0.4)\n",
    "gradient.AddToTable(\"#E3A000\", 0.5)\n",
    "gradient.AddToTable(\"#000762\", 0.9)\n",
    "imgHeight := int(float64(imgWidth) * float64(f.H/f.W))\n",
    "img := image.NewRGBA(image.Rect(0, 0, f.ImgWidth, imgHeight))\n",
    "lastRenderTime := f.Render(img, gradient)\n",
    "fmt.Printf(\"lastRenderTime=%v\\n\", lastRenderTime)\n",
    "gonbui.DisplayImage(img)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87fb9828-c892-447b-9eb1-0717a96c342b",
   "metadata": {},
   "source": [
    "### SVG Drawing\n",
    "\n",
    "From the amazing [SVGo library](https://github.com/ajstarks/svgo), I really wish I was that creative.\n",
    "Below is Antony Stark's Shining example, [demoed here](https://speakerdeck.com/ajstarks/svgo-code-plus-picture-examples)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "48d813a8-8d4e-4ab7-b374-10a73977ec7b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><?xml version=\"1.0\"?>\n",
       "<!-- Generated by SVGo -->\n",
       "<svg width=\"500\" height=\"500\"\n",
       "     xmlns=\"http://www.w3.org/2000/svg\"\n",
       "     xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<defs>\n",
       "<g id=\"unit\">\n",
       "<polyline points=\"0,100 0,40 50,10 100,40 100,100\" style=\"fill:none\" />\n",
       "<polygon points=\"50,40 70,50 70,75 50,85 30,75 30,50\" />\n",
       "</g>\n",
       "<g id=\"runit\">\n",
       "<g transform=\"translate(150,180) rotate(180)\">\n",
       "<use x=\"0\" y=\"0\" xlink:href=\"#unit\" />\n",
       "</g>\n",
       "</g>\n",
       "</defs>\n",
       "<rect x=\"0\" y=\"0\" width=\"500\" height=\"500\" style=\"fill:rgb(227,78,25)\" />\n",
       "<g style=\"stroke:rgb(65,52,44);stroke-width:12;fill:rgb(153,29,40)\">\n",
       "<use x=\"-50\" y=\"0\" xlink:href=\"#unit\" />\n",
       "<use x=\"-50\" y=\"0\" xlink:href=\"#runit\" />\n",
       "<use x=\"50\" y=\"0\" xlink:href=\"#unit\" />\n",
       "<use x=\"50\" y=\"0\" xlink:href=\"#runit\" />\n",
       "<use x=\"150\" y=\"0\" xlink:href=\"#unit\" />\n",
       "<use x=\"150\" y=\"0\" xlink:href=\"#runit\" />\n",
       "<use x=\"250\" y=\"0\" xlink:href=\"#unit\" />\n",
       "<use x=\"250\" y=\"0\" xlink:href=\"#runit\" />\n",
       "<use x=\"350\" y=\"0\" xlink:href=\"#unit\" />\n",
       "<use x=\"350\" y=\"0\" xlink:href=\"#runit\" />\n",
       "<use x=\"450\" y=\"0\" xlink:href=\"#unit\" />\n",
       "<use x=\"450\" y=\"0\" xlink:href=\"#runit\" />\n",
       "<use x=\"-50\" y=\"130\" xlink:href=\"#unit\" />\n",
       "<use x=\"-50\" y=\"130\" xlink:href=\"#runit\" />\n",
       "<use x=\"50\" y=\"130\" xlink:href=\"#unit\" />\n",
       "<use x=\"50\" y=\"130\" xlink:href=\"#runit\" />\n",
       "<use x=\"150\" y=\"130\" xlink:href=\"#unit\" />\n",
       "<use x=\"150\" y=\"130\" xlink:href=\"#runit\" />\n",
       "<use x=\"250\" y=\"130\" xlink:href=\"#unit\" />\n",
       "<use x=\"250\" y=\"130\" xlink:href=\"#runit\" />\n",
       "<use x=\"350\" y=\"130\" xlink:href=\"#unit\" />\n",
       "<use x=\"350\" y=\"130\" xlink:href=\"#runit\" />\n",
       "<use x=\"450\" y=\"130\" xlink:href=\"#unit\" />\n",
       "<use x=\"450\" y=\"130\" xlink:href=\"#runit\" />\n",
       "<use x=\"-50\" y=\"260\" xlink:href=\"#unit\" />\n",
       "<use x=\"-50\" y=\"260\" xlink:href=\"#runit\" />\n",
       "<use x=\"50\" y=\"260\" xlink:href=\"#unit\" />\n",
       "<use x=\"50\" y=\"260\" xlink:href=\"#runit\" />\n",
       "<use x=\"150\" y=\"260\" xlink:href=\"#unit\" />\n",
       "<use x=\"150\" y=\"260\" xlink:href=\"#runit\" />\n",
       "<use x=\"250\" y=\"260\" xlink:href=\"#unit\" />\n",
       "<use x=\"250\" y=\"260\" xlink:href=\"#runit\" />\n",
       "<use x=\"350\" y=\"260\" xlink:href=\"#unit\" />\n",
       "<use x=\"350\" y=\"260\" xlink:href=\"#runit\" />\n",
       "<use x=\"450\" y=\"260\" xlink:href=\"#unit\" />\n",
       "<use x=\"450\" y=\"260\" xlink:href=\"#runit\" />\n",
       "<use x=\"-50\" y=\"390\" xlink:href=\"#unit\" />\n",
       "<use x=\"-50\" y=\"390\" xlink:href=\"#runit\" />\n",
       "<use x=\"50\" y=\"390\" xlink:href=\"#unit\" />\n",
       "<use x=\"50\" y=\"390\" xlink:href=\"#runit\" />\n",
       "<use x=\"150\" y=\"390\" xlink:href=\"#unit\" />\n",
       "<use x=\"150\" y=\"390\" xlink:href=\"#runit\" />\n",
       "<use x=\"250\" y=\"390\" xlink:href=\"#unit\" />\n",
       "<use x=\"250\" y=\"390\" xlink:href=\"#runit\" />\n",
       "<use x=\"350\" y=\"390\" xlink:href=\"#unit\" />\n",
       "<use x=\"350\" y=\"390\" xlink:href=\"#runit\" />\n",
       "<use x=\"450\" y=\"390\" xlink:href=\"#unit\" />\n",
       "<use x=\"450\" y=\"390\" xlink:href=\"#runit\" />\n",
       "</g>\n",
       "</svg>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import \"bytes\"\n",
    "import svgo \"github.com/ajstarks/svgo\"\n",
    "import \"github.com/janpfeifer/gonb/gonbui\"\n",
    "\n",
    "func Shining(width, height int) string {\n",
    "    buf := bytes.NewBuffer(nil)\n",
    "    canvas := svgo.New(buf)\n",
    "    xp := []int{50, 70, 70, 50, 30, 30}\n",
    "    yp := []int{40, 50, 75, 85, 75, 50}\n",
    "    xl := []int{0, 0, 50, 100, 100}\n",
    "    yl := []int{100, 40, 10, 40, 100}\n",
    "    bgcolor := \"rgb(227,78,25)\"\n",
    "    bkcolor := \"rgb(153,29,40)\"\n",
    "    stcolor := \"rgb(65,52,44)\"\n",
    "    stwidth := 12\n",
    "    stylefmt := \"stroke:%s;stroke-width:%d;fill:%s\"\n",
    "    canvas.Start(width, height)\n",
    "    canvas.Def()\n",
    "    canvas.Gid(\"unit\")\n",
    "    canvas.Polyline(xl, yl, \"fill:none\")\n",
    "    canvas.Polygon(xp, yp)\n",
    "    canvas.Gend()\n",
    "    canvas.Gid(\"runit\")\n",
    "    canvas.TranslateRotate(150, 180, 180)\n",
    "    canvas.Use(0, 0, \"#unit\")\n",
    "    canvas.Gend()\n",
    "    canvas.Gend()\n",
    "    canvas.DefEnd()\n",
    "    canvas.Rect(0, 0, width, height, \"fill:\"+bgcolor)\n",
    "    canvas.Gstyle(fmt.Sprintf(stylefmt, stcolor, stwidth, bkcolor))\n",
    "    for y := 0; y < height; y += 130 {\n",
    "        for x := -50; x < width; x += 100 {\n",
    "            canvas.Use(x, y, \"#unit\")\n",
    "            canvas.Use(x, y, \"#runit\")\n",
    "        }\n",
    "    } \n",
    "    canvas.Gend()\n",
    "    canvas.End()\n",
    "    return buf.String()\n",
    "}\n",
    "\n",
    "%%\n",
    "gonbui.DisplaySvg(Shining(500, 500))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61449cd0-4a9a-4934-ae73-5aa504edf3fb",
   "metadata": {},
   "source": [
    "### Plotting with [Margaid (SVG)](https://github.com/erkkah/margaid)\n",
    "\n",
    "A real pearl!\n",
    "\n",
    "Since its latest update is not yet \"released\" (tagged in Git), we needed to get the version on the specific commit. See \"Executing Shell Commands\" below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "1fda7399-ecb1-44c2-b05c-fb52d188822a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "go: added github.com/erkkah/margaid v0.1.1-0.20230128143048-d60b2efd2f5a\n"
     ]
    }
   ],
   "source": [
    "!*go get -u github.com/erkkah/margaid@d60b2efd2f5acc5d8fbbe13eaf85f1532e11a2fb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "6904a8ef-5a4c-412f-ad75-58910d933b76",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><svg style=\"background-color:#f8f8f8\" preserveAspectRatio=\"xMidYMid meet\" xmlns=\"http://www.w3.org/2000/svg\" width=\"640\" height=\"480\" viewbox=\"0 0 640 480\"><defs><marker id=\"circle\" viewBox=\"0 0 10 10 \" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\"><circle cx=\"5\" cy=\"5\" r=\"3\" fill=\"none\" stroke=\"black\"/></marker><marker id=\"filled-circle\" viewBox=\"0 0 10 10 \" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\"><circle cx=\"5\" cy=\"5\" r=\"3\" fill=\"black\" stroke=\"none\"/></marker><marker markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\" id=\"square\" viewBox=\"0 0 10 10 \" refX=\"5\" refY=\"5\"><rect x=\"2\" y=\"2\" width=\"6\" height=\"6\" fill=\"none\" stroke=\"black\"/></marker><marker refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\" id=\"filled-square\" viewBox=\"0 0 10 10 \"><rect fill=\"black\" stroke=\"none\" x=\"2\" y=\"2\" width=\"6\" height=\"6\"/></marker></defs><g transform=\"translate(70 410 )scale(1 -1 )\" stroke-width=\"1px\" stroke-linejoin=\"round\" marker-end=\"url(#square)\" stroke=\"hsl(90, 47%, 65%)\" fill=\"none\" marker-start=\"url(#square)\" marker-mid=\"url(#square)\" stroke-linecap=\"round\"><path vector-effect=\"non-scaling-stroke\" d=\"M10,6.800000e+00 L6.333333e+01,4.306667e+01 L1.166667e+02,7.933333e+01 L170,1.156000e+02 L2.233333e+02,1.518667e+02 L2.766667e+02,1.881333e+02 L330,2.244000e+02 L3.833333e+02,2.606667e+02 L4.366667e+02,2.969333e+02 L490,3.332000e+02 \"/></g><g stroke=\"hsl(301, 88%, 65%)\" stroke-linecap=\"round\" transform=\"translate(70 410 )scale(1 -1 )\" fill=\"none\" stroke-width=\"3.14px\" stroke-linejoin=\"round\"><path d=\"M1.000000e+01,6.800000e+00 C1.888889e+01,6.875434e+00 4.555556e+01,7.018758e+00 6.333333e+01,7.252602e+00 C8.111111e+01,7.486446e+00 9.888889e+01,7.711993e+00 1.166667e+02,8.203066e+00 C1.344444e+02,8.694139e+00 1.522222e+02,9.167786e+00 1.700000e+02,1.019904e+01 C1.877778e+02,1.123029e+01 2.055556e+02,1.222495e+01 2.233333e+02,1.439059e+01 C2.411111e+02,1.655622e+01 2.588889e+02,1.864500e+01 2.766667e+02,2.319283e+01 C2.944444e+02,2.774066e+01 3.122222e+02,3.212711e+01 3.300000e+02,4.167755e+01 C3.477778e+02,5.122798e+01 3.655556e+02,6.043953e+01 3.833333e+02,8.049545e+01 C4.011111e+02,1.005514e+02 4.188889e+02,1.198956e+02 4.366667e+02,1.620130e+02 C4.544444e+02,2.041305e+02 4.811111e+02,3.046688e+02 4.900000e+02,3.332000e+02 \" vector-effect=\"non-scaling-stroke\"/></g><g transform=\"translate(70 410 )scale(1 -1 )\" stroke-linejoin=\"round\" marker-mid=\"url(#filled-circle)\" stroke=\"hsl(152, 76%, 65%)\" fill=\"none\" stroke-width=\"3px\" marker-start=\"url(#filled-circle)\" marker-end=\"url(#filled-circle)\" stroke-linecap=\"round\"><path d=\"M1.000000e+01,2.499846e+02 C1.888889e+01,2.496499e+02 4.555556e+01,2.541855e+02 6.333333e+01,2.479764e+02 C8.111111e+01,2.417672e+02 9.888889e+01,2.190764e+02 1.166667e+02,2.127298e+02 C1.344444e+02,2.063832e+02 1.522222e+02,2.063289e+02 1.700000e+02,2.098965e+02 C1.877778e+02,2.134642e+02 2.055556e+02,2.263553e+02 2.233333e+02,2.341355e+02 C2.411111e+02,2.419157e+02 2.588889e+02,2.496024e+02 2.766667e+02,2.565778e+02 C2.944444e+02,2.635532e+02 3.122222e+02,2.765158e+02 3.300000e+02,2.759878e+02 C3.477778e+02,2.754598e+02 3.655556e+02,2.554924e+02 3.833333e+02,2.534097e+02 C4.011111e+02,2.513271e+02 4.188889e+02,2.648923e+02 4.366667e+02,2.634918e+02 C4.544444e+02,2.620912e+02 4.811111e+02,2.480873e+02 4.900000e+02,2.450064e+02 \" vector-effect=\"non-scaling-stroke\"/></g><g transform=\"translate(70 410 )scale(1 -1 )\" fill=\"none\" stroke-width=\"2px\" stroke-linejoin=\"round\" stroke=\"black\" stroke-linecap=\"round\"><path d=\"M10,0 L10,-6 M6.333333e+01,0 L6.333333e+01,-6 M1.166667e+02,0 L1.166667e+02,-6 M170,0 L170,-6 M2.233333e+02,0 L2.233333e+02,-6 M2.766667e+02,0 L2.766667e+02,-6 M330,0 L330,-6 M3.833333e+02,0 L3.833333e+02,-6 M4.366667e+02,0 L4.366667e+02,-6 M490,0 L490,-6 \" vector-effect=\"non-scaling-stroke\"/></g><g stroke-linecap=\"round\" stroke-width=\"2px\" stroke-linejoin=\"round\" transform=\"translate(70 410 )scale(1 1 )\" font-family=\"sans-serif\" font-style=\"normal\" font-weight=\"normal\" fill=\"black\" font-size=\"12px\" text-anchor=\"middle\" dominant-baseline=\"hanging\" stroke=\"black\"><text dominant-baseline=\"hanging\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"10\" y=\"10\">1</text><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"6.333333e+01\" y=\"10\" dominant-baseline=\"hanging\">2</text><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"1.166667e+02\" y=\"10\" dominant-baseline=\"hanging\">3</text><text y=\"10\" dominant-baseline=\"hanging\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"170\">4</text><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"2.233333e+02\" y=\"10\" dominant-baseline=\"hanging\">5</text><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"2.766667e+02\" y=\"10\" dominant-baseline=\"hanging\">6</text><text dominant-baseline=\"hanging\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"330\" y=\"10\">7</text><text x=\"3.833333e+02\" y=\"10\" dominant-baseline=\"hanging\" stroke=\"none\" vector-effect=\"non-scaling-stroke\">8</text><text dominant-baseline=\"hanging\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"4.366667e+02\" y=\"10\">9</text><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"490\" y=\"10\" dominant-baseline=\"hanging\">10</text></g><g text-anchor=\"middle\" stroke=\"black\" transform=\"translate(70 410 )scale(1 1 )rotate(0 0 0 )\" font-weight=\"bold\" fill=\"black\" dominant-baseline=\"baseline\" stroke-linecap=\"round\" font-family=\"sans-serif\" font-style=\"normal\" stroke-width=\"2px\" stroke-linejoin=\"round\" font-size=\"12px\"><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"250\" y=\"-6\" dominant-baseline=\"baseline\">X</text></g><g font-family=\"sans-serif\" font-style=\"normal\" font-weight=\"bold\" fill=\"black\" font-size=\"12px\" dominant-baseline=\"baseline\" stroke=\"black\" stroke-width=\"2px\" stroke-linejoin=\"round\" text-anchor=\"middle\" stroke-linecap=\"round\" transform=\"translate(70 410 )scale(1 -1 )\"><path vector-effect=\"non-scaling-stroke\" d=\"M0,2.472591e+01 L-6,2.472591e+01 M0,5.860766e+01 L-6,5.860766e+01 M0,9.248942e+01 L-6,9.248942e+01 M0,1.263712e+02 L-6,1.263712e+02 M0,1.602529e+02 L-6,1.602529e+02 M0,1.941347e+02 L-6,1.941347e+02 M0,2.280164e+02 L-6,2.280164e+02 M0,2.618982e+02 L-6,2.618982e+02 M0,2.957799e+02 L-6,2.957799e+02 M0,3.296617e+02 L-6,3.296617e+02 \"/></g><g dominant-baseline=\"middle\" stroke=\"black\" transform=\"translate(70 410 )scale(1 1 )\" font-style=\"normal\" fill=\"black\" stroke-width=\"2px\" stroke-linejoin=\"round\" text-anchor=\"end\" stroke-linecap=\"round\" font-family=\"sans-serif\" font-weight=\"normal\" font-size=\"12px\"><text y=\"-2.472591e+01\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"-10\">1.0</text><text x=\"-10\" y=\"-5.860766e+01\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\">2.0</text><text y=\"-9.248942e+01\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"-10\">4.0</text><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"-10\" y=\"-1.263712e+02\" dominant-baseline=\"middle\">8.0</text><text x=\"-10\" y=\"-1.602529e+02\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\">16.0</text><text x=\"-10\" y=\"-1.941347e+02\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\">32.0</text><text y=\"-2.280164e+02\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"-10\">64.0</text><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"-10\" y=\"-2.618982e+02\" dominant-baseline=\"middle\">128.0</text><text dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"-10\" y=\"-2.957799e+02\">256.0</text><text y=\"-3.296617e+02\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"-10\">512.0</text></g><g font-style=\"normal\" font-weight=\"bold\" stroke-linejoin=\"round\" font-size=\"12px\" stroke=\"black\" stroke-linecap=\"round\" fill=\"black\" stroke-width=\"2px\" text-anchor=\"middle\" dominant-baseline=\"hanging\" transform=\"translate(70 410 )scale(1 1 )rotate(-90 0 0 )\" font-family=\"sans-serif\"><text vector-effect=\"non-scaling-stroke\" x=\"170\" y=\"6\" dominant-baseline=\"hanging\" stroke=\"none\">Y</text></g><g fill=\"black\" stroke-width=\"0.5px\" dominant-baseline=\"hanging\" stroke=\"gray\" stroke-linecap=\"round\" transform=\"translate(70 410 )scale(1 -1 )\" font-family=\"sans-serif\" font-style=\"normal\" stroke-linejoin=\"round\" font-size=\"12px\" text-anchor=\"middle\" font-weight=\"bold\"><path vector-effect=\"non-scaling-stroke\" d=\"M0,2.472591e+01 L500,2.472591e+01 M0,5.860766e+01 L500,5.860766e+01 M0,9.248942e+01 L500,9.248942e+01 M0,1.263712e+02 L500,1.263712e+02 M0,1.602529e+02 L500,1.602529e+02 M0,1.941347e+02 L500,1.941347e+02 M0,2.280164e+02 L500,2.280164e+02 M0,2.618982e+02 L500,2.618982e+02 M0,2.957799e+02 L500,2.957799e+02 M0,3.296617e+02 L500,3.296617e+02 \"/></g><g text-anchor=\"middle\" stroke=\"black\" stroke-linecap=\"round\" font-weight=\"bold\" stroke-width=\"2px\" dominant-baseline=\"hanging\" font-family=\"sans-serif\" font-style=\"normal\" fill=\"none\" stroke-linejoin=\"round\" font-size=\"12px\"><rect height=\"340\" vector-effect=\"non-scaling-stroke\" x=\"70\" y=\"70\" width=\"500\"/><g fill=\"black\" font-size=\"18px\" dominant-baseline=\"middle\"><text x=\"320\" y=\"35\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\">A diagram of sorts 📊 📈</text></g></g></svg></div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import \"bytes\"\n",
    "import \"github.com/janpfeifer/gonb/gonbui\"\n",
    "import mg \"github.com/erkkah/margaid\"\n",
    "\n",
    "func mgPlot(width, height int) string {\n",
    "    randomSeries := mg.NewSeries()\n",
    "    rand.Seed(time.Now().Unix())\n",
    "    for i := float64(0); i < 10; i++ {\n",
    "        randomSeries.Add(mg.MakeValue(i+1, 200*rand.Float64()))\n",
    "    }\n",
    "\n",
    "    testSeries := mg.NewSeries()\n",
    "    multiplier := 2.1\n",
    "    v := 0.33\n",
    "    for i := float64(0); i < 10; i++ {\n",
    "        v *= multiplier\n",
    "        testSeries.Add(mg.MakeValue(i+1, v))\n",
    "    }\n",
    "\n",
    "    diagram := mg.New(width, height,\n",
    "        mg.WithAutorange(mg.XAxis, testSeries),\n",
    "        mg.WithAutorange(mg.YAxis, testSeries),\n",
    "        mg.WithAutorange(mg.Y2Axis, testSeries),\n",
    "        mg.WithProjection(mg.YAxis, mg.Log),\n",
    "        mg.WithInset(70),\n",
    "        mg.WithPadding(2),\n",
    "        mg.WithColorScheme(90),\n",
    "        mg.WithBackgroundColor(\"#f8f8f8\"),\n",
    "    )\n",
    "\n",
    "    diagram.Line(testSeries, mg.UsingAxes(mg.XAxis, mg.YAxis), mg.UsingMarker(\"square\"), mg.UsingStrokeWidth(1))\n",
    "    diagram.Smooth(testSeries, mg.UsingAxes(mg.XAxis, mg.Y2Axis), mg.UsingStrokeWidth(3.14))\n",
    "    diagram.Smooth(randomSeries, mg.UsingAxes(mg.XAxis, mg.YAxis), mg.UsingMarker(\"filled-circle\"))\n",
    "    diagram.Axis(testSeries, mg.XAxis, diagram.ValueTicker('f', 0, 10), false, \"X\")\n",
    "    diagram.Axis(testSeries, mg.YAxis, diagram.ValueTicker('f', 1, 2), true, \"Y\")\n",
    "\n",
    "    diagram.Frame()\n",
    "    diagram.Title(\"A diagram of sorts 📊 📈\")\n",
    "    buf := bytes.NewBuffer(nil)\n",
    "    diagram.Render(buf)\n",
    "    return buf.String()\n",
    "}\n",
    "\n",
    "%%\n",
    "gonbui.DisplaySvg(mgPlot(640, 480))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f534d6c-57c4-4ec1-ba71-310d73fa5802",
   "metadata": {},
   "source": [
    "### Animated Plots with `UpdateHtml`\n",
    "\n",
    "Still using Margaid but now we animate a `Sin(x)` plot varying the frequency from 0.0 to 10.0, every 10 milliseconds. This demonstrates `gonbui.UpdateHtml(id, html)`: it allows a transient HTML cell to be updated in the middle of the execution of a cell.\n",
    "\n",
    "> **Note**: This also works with markdown, use `gonbui.UpdateMarkdown(id, markdown)` instead. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "293ceefc-c50c-4817-98fe-5f15ee4d0754",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<svg preserveAspectRatio=\"xMidYMid meet\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1024\" height=\"400\" viewbox=\"0 0 1024 400\" style=\"background-color:#f8f8f8\"><defs><marker refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\" id=\"circle\" viewBox=\"0 0 10 10 \" refX=\"5\"><circle cx=\"5\" cy=\"5\" r=\"3\" fill=\"none\" stroke=\"black\"/></marker><marker markerWidth=\"2%\" markerHeight=\"2%\" id=\"filled-circle\" viewBox=\"0 0 10 10 \" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\"><circle cy=\"5\" r=\"3\" fill=\"black\" stroke=\"none\" cx=\"5\"/></marker><marker refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\" id=\"square\" viewBox=\"0 0 10 10 \" refX=\"5\"><rect width=\"6\" height=\"6\" fill=\"none\" stroke=\"black\" x=\"2\" y=\"2\"/></marker><marker refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\" id=\"filled-square\" viewBox=\"0 0 10 10 \" refX=\"5\"><rect width=\"6\" height=\"6\" fill=\"black\" stroke=\"none\" x=\"2\" y=\"2\"/></marker></defs><g stroke=\"hsl(198, 47%, 65%)\" stroke-width=\"3.14px\" stroke-linecap=\"round\" stroke-linejoin=\"round\" transform=\"translate(64 336 )scale(1 -1 )\" fill=\"none\"><path vector-effect=\"non-scaling-stroke\" d=\"M0.000000e+00,1.360151e+02 C1.508418e+00,1.492823e+02 6.033670e+00,1.941026e+02 9.050505e+00,2.156183e+02 C1.206734e+01,2.371339e+02 1.508418e+01,2.567511e+02 1.810101e+01,2.651091e+02 C2.111785e+01,2.734670e+02 2.413468e+01,2.737275e+02 2.715152e+01,2.657661e+02 C3.016835e+01,2.578047e+02 3.318519e+01,2.386099e+02 3.620202e+01,2.173408e+02 C3.921886e+01,1.960717e+02 4.223569e+01,1.646827e+02 4.525253e+01,1.381516e+02 C4.826936e+01,1.116205e+02 5.128620e+01,7.991108e+01 5.430303e+01,5.815415e+01 C5.731987e+01,3.639723e+01 6.033670e+01,1.636254e+01 6.335354e+01,7.610031e+00 C6.637037e+01,-1.142479e+00 6.938721e+01,-1.923721e+00 7.240404e+01,5.639090e+00 C7.542088e+01,1.320190e+01 7.843771e+01,3.196963e+01 8.145455e+01,5.298689e+01 C8.447138e+01,7.400416e+01 8.748822e+01,1.052214e+02 9.050505e+01,1.317427e+02 C9.352189e+01,1.582640e+02 9.653872e+01,1.901218e+02 9.955556e+01,2.121146e+02 C1.025724e+02,2.341075e+02 1.055892e+02,2.545547e+02 1.086061e+02,2.636996e+02 C1.116229e+02,2.728445e+02 1.146397e+02,2.741463e+02 1.176566e+02,2.669840e+02 C1.206734e+02,2.598216e+02 1.236902e+02,2.414856e+02 1.267071e+02,2.207253e+02 C1.297239e+02,1.999651e+02 1.327407e+02,1.689273e+02 1.357576e+02,1.424224e+02 C1.387744e+02,1.159175e+02 1.417912e+02,8.391904e+01 1.448081e+02,6.169575e+01 C1.478249e+02,3.947246e+01 1.508418e+02,1.861768e+01 1.538586e+02,9.082673e+00 C1.568754e+02,-4.523356e-01 1.598923e+02,-2.274485e+00 1.629091e+02,4.485700e+00 C1.659259e+02,1.124588e+01 1.689428e+02,2.914565e+01 1.719596e+02,4.964378e+01 C1.749764e+02,7.014191e+01 1.779933e+02,1.009924e+02 1.810101e+02,1.274745e+02 C1.840269e+02,1.539565e+02 1.870438e+02,1.860876e+02 1.900606e+02,2.085359e+02 C1.930774e+02,2.309842e+02 1.960943e+02,2.522414e+02 1.991111e+02,2.621641e+02 C2.021279e+02,2.720869e+02 2.051448e+02,2.744289e+02 2.081616e+02,2.680726e+02 C2.111785e+02,2.617163e+02 2.141953e+02,2.442572e+02 2.172121e+02,2.240262e+02 C2.202290e+02,2.037953e+02 2.232458e+02,1.731395e+02 2.262626e+02,1.466869e+02 C2.292795e+02,1.202343e+02 2.322963e+02,8.797842e+01 2.353131e+02,6.531070e+01 C2.383300e+02,4.264297e+01 2.413468e+02,2.098868e+01 2.443636e+02,1.068058e+01 C2.473805e+02,3.724845e-01 2.503973e+02,-2.488773e+00 2.534141e+02,3.462114e+00 C2.564310e+02,9.413000e+00 2.594478e+02,2.642714e+01 2.624646e+02,4.638590e+01 C2.654815e+02,6.634466e+01 2.684983e+02,9.679807e+01 2.715152e+02,1.232147e+02 C2.745320e+02,1.496313e+02 2.775488e+02,1.820041e+02 2.805657e+02,2.048856e+02 C2.835825e+02,2.277672e+02 2.865993e+02,2.498133e+02 2.896162e+02,2.605042e+02 C2.926330e+02,2.711951e+02 2.956498e+02,2.745749e+02 2.986667e+02,2.690309e+02 C3.016835e+02,2.634869e+02 3.047003e+02,2.469219e+02 3.077172e+02,2.272403e+02 C3.107340e+02,2.075586e+02 3.137508e+02,1.773151e+02 3.167677e+02,1.509409e+02 C3.197845e+02,1.245668e+02 3.228013e+02,9.208521e+01 3.258182e+02,6.899542e+01 C3.288350e+02,4.590563e+01 3.318519e+02,2.347319e+01 3.348687e+02,1.240218e+01 C3.378855e+02,1.331167e+00 3.409024e+02,-2.566375e+00 3.439192e+02,2.569341e+00 C3.469360e+02,7.705057e+00 3.499529e+02,2.381677e+01 3.529697e+02,4.321648e+01 C3.559865e+02,6.261618e+01 3.590034e+02,9.264240e+01 3.620202e+02,1.189676e+02 C3.650370e+02,1.452927e+02 3.680539e+02,1.778751e+02 3.710707e+02,2.011674e+02 C3.740875e+02,2.244597e+02 3.771044e+02,2.472729e+02 3.801212e+02,2.587214e+02 C3.831380e+02,2.701698e+02 3.861549e+02,2.745841e+02 3.891717e+02,2.698579e+02 C3.921886e+02,2.651317e+02 3.952054e+02,2.494772e+02 3.982222e+02,2.303643e+02 C4.012391e+02,2.112513e+02 4.042559e+02,1.814498e+02 4.072727e+02,1.551802e+02 C4.102896e+02,1.289105e+02 4.133064e+02,9.623535e+01 4.163232e+02,7.274628e+01 C4.193401e+02,4.925721e+01 4.223569e+02,2.606877e+01 4.253737e+02,1.424577e+01 C4.283906e+02,2.422767e+00 4.314074e+02,-2.507213e+00 4.344242e+02,1.808264e+00 C4.374411e+02,6.123741e+00 4.404579e+02,2.131714e+01 4.434747e+02,4.013863e+01 C4.464916e+02,5.896013e+01 4.495084e+02,8.852953e+01 4.525253e+02,1.147372e+02 C4.555421e+02,1.409449e+02 4.585589e+02,1.737048e+02 4.615758e+02,1.973848e+02 C4.645926e+02,2.210649e+02 4.676094e+02,2.446228e+02 4.706263e+02,2.568175e+02 C4.736431e+02,2.690121e+02 4.766599e+02,2.744566e+02 4.796768e+02,2.705529e+02 C4.826936e+02,2.666491e+02 4.857104e+02,2.519206e+02 4.887273e+02,2.333952e+02 C4.917441e+02,2.148698e+02 4.947609e+02,1.855398e+02 4.977778e+02,1.594005e+02 C5.007946e+02,1.332612e+02 5.038114e+02,1.004247e+02 5.068283e+02,7.655958e+01 C5.098451e+02,5.269442e+01 5.128620e+02,2.877286e+01 5.158788e+02,1.620953e+01 C5.188956e+02,3.646206e+00 5.219125e+02,-2.311347e+00 5.249293e+02,1.179632e+00 C5.279461e+02,4.670611e+00 5.309630e+02,1.893069e+01 5.339798e+02,3.715541e+01 C5.369966e+02,5.538012e+01 5.400135e+02,8.446352e+01 5.430303e+02,1.105279e+02 C5.460471e+02,1.365923e+02 5.490640e+02,1.694973e+02 5.520808e+02,1.935417e+02 C5.550976e+02,2.175861e+02 5.581145e+02,2.418654e+02 5.611313e+02,2.547943e+02 C5.641481e+02,2.677232e+02 5.671650e+02,2.741924e+02 5.701818e+02,2.711150e+02 C5.731987e+02,2.680376e+02 5.762155e+02,2.542495e+02 5.792323e+02,2.363300e+02 C5.822492e+02,2.184105e+02 5.852660e+02,1.895809e+02 5.882828e+02,1.635978e+02 C5.912997e+02,1.376147e+02 5.943165e+02,1.046493e+02 5.973333e+02,8.043156e+01 C6.003502e+02,5.621385e+01 6.033670e+02,3.158278e+01 6.063838e+02,1.829153e+01 C6.094007e+02,5.000278e+00 6.124175e+02,-1.978970e+00 6.154343e+02,6.840666e-01 C6.184512e+02,3.347103e+00 6.214680e+02,1.665980e+01 6.244848e+02,3.426974e+01 C6.275017e+02,5.187969e+01 6.305185e+02,8.044839e+01 6.335354e+02,1.063437e+02 C6.365522e+02,1.322391e+02 6.395690e+02,1.652568e+02 6.425859e+02,1.896418e+02 C6.456027e+02,2.140269e+02 6.486195e+02,2.390036e+02 6.516364e+02,2.526540e+02 C6.546532e+02,2.663043e+02 6.576700e+02,2.737919e+02 6.606869e+02,2.715439e+02 C6.637037e+02,2.692958e+02 6.667205e+02,2.564618e+02 6.697374e+02,2.391658e+02 C6.727542e+02,2.218698e+02 6.757710e+02,1.935691e+02 6.787879e+02,1.677678e+02 C6.818047e+02,1.419666e+02 6.848215e+02,1.089047e+02 6.878384e+02,8.435839e+01 C6.908552e+02,5.981204e+01 6.938721e+02,3.449576e+01 6.968889e+02,2.048970e+01 C6.999057e+02,6.483645e+00 7.029226e+02,-1.510409e+00 7.059394e+02,3.220567e-01 C7.089562e+02,2.154522e+00 7.119731e+02,1.450669e+01 7.149899e+02,3.148449e+01 C7.180067e+02,4.846229e+01 7.210236e+02,7.648810e+01 7.240404e+02,1.021889e+02 C7.270572e+02,1.278896e+02 7.300741e+02,1.609874e+02 7.330909e+02,1.856890e+02 C7.361077e+02,2.103906e+02 7.391246e+02,2.360402e+02 7.421414e+02,2.503985e+02 C7.451582e+02,2.647568e+02 7.481751e+02,2.732554e+02 7.511919e+02,2.718390e+02 C7.542088e+02,2.704225e+02 7.572256e+02,2.585552e+02 7.602424e+02,2.418998e+02 C7.632593e+02,2.252444e+02 7.662761e+02,1.975005e+02 7.692929e+02,1.719065e+02 C7.723098e+02,1.463126e+02 7.753266e+02,1.131870e+02 7.783434e+02,8.833620e+01 C7.813603e+02,6.348543e+01 7.843771e+02,3.750892e+01 7.873939e+02,2.280188e+01 C7.904108e+02,8.094844e+00 7.934276e+02,-9.061263e-01 7.964444e+02,9.395948e-02 C7.994613e+02,1.094045e+00 8.024781e+02,1.247350e+01 8.054949e+02,2.880240e+01 C8.085118e+02,4.513130e+01 8.115286e+02,7.258655e+01 8.145455e+02,9.806735e+01 C8.175623e+02,1.235482e+02 8.205791e+02,1.566934e+02 8.235960e+02,1.816872e+02 C8.266128e+02,2.066810e+02 8.296296e+02,2.329781e+02 8.326465e+02,2.480302e+02 C8.356633e+02,2.630823e+02 8.386801e+02,2.725835e+02 8.416970e+02,2.720000e+02 C8.447138e+02,2.714165e+02 8.477306e+02,2.605277e+02 8.507475e+02,2.445293e+02 C8.537643e+02,2.285310e+02 8.567811e+02,2.013712e+02 8.597980e+02,1.760098e+02 C8.628148e+02,1.506484e+02 8.658316e+02,1.174917e+02 8.688485e+02,9.236106e+01 C8.718653e+02,6.723039e+01 8.748822e+02,4.061931e+01 8.778990e+02,2.522580e+01 C8.809158e+02,9.832285e+00 8.839327e+02,-1.667194e-01 8.869495e+02,0.000000e+00 C8.899663e+02,1.667194e-01 8.944916e+02,2.185509e+01 8.960000e+02,2.622611e+01 \"/></g><g fill=\"none\" stroke=\"black\" stroke-width=\"2px\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect vector-effect=\"non-scaling-stroke\" x=\"64\" y=\"64\" width=\"896\" height=\"272\"/><g fill=\"black\" font-family=\"sans-serif\" font-weight=\"bold\" dominant-baseline=\"middle\" font-size=\"18px\" font-style=\"normal\" text-anchor=\"middle\"><text stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"512\" y=\"32\" dominant-baseline=\"middle\">Animated Sine</text></g></g></svg>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import (\n",
    "    \"bytes\"\n",
    "    \"math\"\n",
    "    \"time\"\n",
    "    \n",
    "     \"github.com/janpfeifer/gonb/gonbui\"\n",
    "     mg \"github.com/erkkah/margaid\"\n",
    ")\n",
    "\n",
    "\n",
    "func mgSinPlot(width, height int, freq float64) string {\n",
    "    series := mg.NewSeries()\n",
    "    const numPoints = 100\n",
    "    for i := 0; i < numPoints; i++ {\n",
    "        x := float64(i) / float64(numPoints) * 2.0 * math.Pi * freq\n",
    "        series.Add(mg.MakeValue(x, math.Sin(x)))\n",
    "    }\n",
    "    diagram := mg.New(width, height,\n",
    "        mg.WithAutorange(mg.XAxis, series),\n",
    "        mg.WithAutorange(mg.YAxis, series),\n",
    "        mg.WithBackgroundColor(\"#f8f8f8\"),\n",
    "    )\n",
    "    diagram.Smooth(series, mg.UsingAxes(mg.XAxis, mg.YAxis), mg.UsingStrokeWidth(3.14))\n",
    "    diagram.Frame()\n",
    "    diagram.Title(\"Animated Sine\")\n",
    "    buf := bytes.NewBuffer(nil)\n",
    "    diagram.Render(buf)\n",
    "    return buf.String()\n",
    "}\n",
    "\n",
    "%%\n",
    "htmlCellId := \"sin_plot\"+gonbui.UniqueId()\n",
    "plotSvg := \"\"\n",
    "ticker := time.NewTicker(10 * time.Millisecond)\n",
    "for freq := 0.0; freq <= 10.0; freq += 0.05 {\n",
    "    plotSvg = mgSinPlot(1024, 400, freq)\n",
    "    gonbui.UpdateHtml(htmlCellId, plotSvg)\n",
    "    <-ticker.C\n",
    "}\n",
    "ticker.Stop()\n",
    "\n",
    "// Erase transient image and re-display it so it can be persisted.\n",
    "gonbui.UpdateHtml(htmlCellId, \"\")\n",
    "gonbui.DisplayHtml(plotSvg)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b6d9d8f-de5e-4154-9f09-21bb3b2f545f",
   "metadata": {},
   "source": [
    "### Plotting with [Gonum Plot](https://github.com/gonum/plot) (SVG and PNG)\n",
    "\n",
    "Another great plotting library."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "58248364-f1b3-4e56-adc7-7034a1f6c56d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhUAAAELCAIAAADhsuNfAACAAElEQVR4nOydd1xTV/vAz703O4QQIGHvKcMByBL3bq1Wbe0e2mXXr63d6tva9Xa3tq9t3/e1Q21rHXWLey8UZCggeyTsAIEMsu+9vw9cjAghCRCW7/l+8kdy7rnnPjeQ89xznkUjSRJAIBAIBNJHaMMtAATSK3v27Llw4YKbm9tbb71l98FxHMcwDADw008/FRQUJCYmPvzww3a/ykD466+/0tPTAwMDX3755eGWBQIxAzrcAkD+1zl37txjjz3GZrMTEhLmzp07a9as//u//2trawMALF68mMPh7Nmzx+4X3bt3L5/Pr6mpAQA8//zzFRUV58+ft/tVBshDDz1kNBoPHTo03IJAIOaB+gMyzEyZMuWNN97QarWrV68+evTo7t27MzMzZ82a1adB9u3bZ7VPdna2RCKh3sfGxr755psikai/UkMgEKg/ICMMR0fHp5566vLly9TiwCzdjHbXrl377LPPrI781ltvmfSHj4/P+++/T6fTbRHJXjbCruP0Nia0R0JGEVB/QEYcHA4HANDQ0NCt3WAwrFmz5p577nniiSemTJmyY8cOAEBGRsazzz5bUlLy0EMPHTx48Ntvv42Kirp8+TIAYNeuXXPnzn3//fcJgnjnnXdOnDixbt26lStXtrS0/OMf/4iOjq6oqLAsiVQqXbJkycMPP3zvvfdSNpjq6upnnnkmOjr6gw8+IAjip59+mjFjxsGDBwEAFy9enDZt2uOPPx4bG/v6668DAOrq6lauXDlp0qSPP/44MjKSzWYvX75806ZNM2fOdHR0DA8PLysrAwBs3bp13Lhxjz766OTJk728vObOnVtbW9tTGJVK9dRTTy1ZsmTZsmXLly83GAx2/dYhkL5DQiDDTU5ODmWToD4+//zzAoFArVaTJLl27drExESq/Z///OfEiRMNBgNJkkVFRTQaLSMjo1sfrVYLADhx4gT18b777nv66adJkmxtbQUAXLhwgWovLS0FABQWFlIfFyxYsHLlyp6CLVq06KWXXiJJUq/Xe3l5bd68mSRJlUoVFBT06quvkiT54Ycfnjx5kup89OjRtLQ0kiSzsrIAAPn5+SRJ/vXXXxwOp6GhgSCILVu2UFttBEHU1dV5enq+88471LksFmvHjh0kSWo0milTpsyb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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import (\n",
    "    \"bytes\"\n",
    "    \"math/rand\"\n",
    "\n",
    "    \"github.com/janpfeifer/gonb/gonbui\"\n",
    "    \"gonum.org/v1/plot\"\n",
    "    \"gonum.org/v1/plot/plotter\"\n",
    "    \"gonum.org/v1/plot/plotutil\"\n",
    "    \"gonum.org/v1/plot/vg\"\n",
    ")\n",
    "\n",
    "// randomPoints returns some random x, y points.\n",
    "func randomPoints(n int) plotter.XYs {\n",
    "    pts := make(plotter.XYs, n)\n",
    "    for i := range pts {\n",
    "        if i == 0 {\n",
    "            pts[i].X = rand.Float64()\n",
    "        } else {\n",
    "            pts[i].X = pts[i-1].X + rand.Float64()\n",
    "        }\n",
    "        pts[i].Y = pts[i].X + 10*rand.Float64()\n",
    "    }\n",
    "    return pts\n",
    "}\n",
    "\n",
    "func GonumPlotExample(width, height int, format string) []byte {\n",
    "    rand.Seed(int64(0))\n",
    "\n",
    "    p := plot.New()\n",
    "\n",
    "    p.Title.Text = \"Plotutil example\"\n",
    "    p.X.Label.Text = \"X\"\n",
    "    p.Y.Label.Text = \"Y\"\n",
    "\n",
    "    err := plotutil.AddLinePoints(p,\n",
    "        \"First\", randomPoints(15),\n",
    "        \"Second\", randomPoints(15),\n",
    "        \"Third\", randomPoints(15))\n",
    "    if err != nil {\n",
    "        panic(err)\n",
    "    }\n",
    "    \n",
    "    buf := bytes.NewBuffer(nil)\n",
    "    writerTo, err := p.WriterTo(vg.Points(float64(width)), vg.Points(float64(height)), format)\n",
    "    if err != nil {\n",
    "        panic(err)\n",
    "    }\n",
    "    writerTo.WriteTo(buf)\n",
    "    return buf.Bytes()\n",
    "}\n",
    "\n",
    "%%\n",
    "gonbui.DisplayPng(GonumPlotExample(400, 200, \"png\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c311053c-84f4-43d4-84a3-87e9d987907f",
   "metadata": {},
   "source": [
    "The version in SVG looks better though:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "b5e2269c-3f8c-4f61-9b73-317d0c71498c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><?xml version=\"1.0\"?>\n",
       "<!-- Generated by SVGo and Plotinum VG -->\n",
       "<svg width=\"400pt\" height=\"200pt\" viewBox=\"0 0 400 200\"\n",
       "\txmlns=\"http://www.w3.org/2000/svg\"\n",
       "\txmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g transform=\"scale(1, -1) translate(0, -200)\">\n",
       "<path d=\"M0,0L400,0L400,200L0,200Z\" style=\"fill:#FFFFFF\" />\n",
       "<text x=\"160.5\" y=\"-190.61\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:12px\">Plotutil example</text>\n",
       "<text x=\"216.73\" y=\"-3.9023\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:12px\">X</text>\n",
       "<text x=\"66.253\" y=\"-16.541\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:10px\">1</text>\n",
       "<text x=\"204.57\" y=\"-16.541\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:10px\">4</text>\n",
       "<text x=\"342.88\" y=\"-16.541\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:10px\">7</text>\n",
       "<path d=\"M68.753,24.363L68.753,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M207.07,24.363L207.07,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M345.38,24.363L345.38,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M114.86,28.363L114.86,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M160.96,28.363L160.96,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M253.17,28.363L253.17,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M299.27,28.363L299.27,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M391.48,28.363L391.48,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M44.635,32.363L397.5,32.363\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<g transform=\"rotate(90)\">\n",
       "<text x=\"107.83\" y=\"9.3867\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:12px\">Y</text>\n",
       "</g>\n",
       "<text x=\"20.885\" y=\"-50.736\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:10px\">3</text>\n",
       "<text x=\"20.885\" y=\"-108.05\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:10px\">9</text>\n",
       "<text x=\"15.885\" y=\"-165.36\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:10px\">15</text>\n",
       "<path d=\"M28.385,53.021L36.385,53.021\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M28.385,110.33L36.385,110.33\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M28.385,167.64L36.385,167.64\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M32.385,81.676L36.385,81.676\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M32.385,138.99L36.385,138.99\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M36.385,40.113L36.385,184.21\" style=\"fill:none;stroke:#000000;stroke-width:0.5\" />\n",
       "<path d=\"M44.635,115.5L64.956,45.458L71.454,52.584L75.892,40.113L93.503,121.69L133.16,54.841L171.47,131.95L212.77,128.62L224.93,155.61L230.14,96.862L251.67,75.552L287.52,91.382L311.46,121.71L351.76,98.7L397.5,182.6\" style=\"fill:none;stroke:#F15A60\" />\n",
       "<path d=\"M47.135,115.5A2.5,2.5 0 1 1 42.135,115.5A2.5,2.5 0 1 1 47.135,115.5Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M67.456,45.458A2.5,2.5 0 1 1 62.456,45.458A2.5,2.5 0 1 1 67.456,45.458Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M73.954,52.584A2.5,2.5 0 1 1 68.954,52.584A2.5,2.5 0 1 1 73.954,52.584Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M78.392,40.113A2.5,2.5 0 1 1 73.392,40.113A2.5,2.5 0 1 1 78.392,40.113Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M96.003,121.69A2.5,2.5 0 1 1 91.003,121.69A2.5,2.5 0 1 1 96.003,121.69Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M135.66,54.841A2.5,2.5 0 1 1 130.66,54.841A2.5,2.5 0 1 1 135.66,54.841Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M173.97,131.95A2.5,2.5 0 1 1 168.97,131.95A2.5,2.5 0 1 1 173.97,131.95Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M215.27,128.62A2.5,2.5 0 1 1 210.27,128.62A2.5,2.5 0 1 1 215.27,128.62Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M227.43,155.61A2.5,2.5 0 1 1 222.43,155.61A2.5,2.5 0 1 1 227.43,155.61Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M232.64,96.862A2.5,2.5 0 1 1 227.64,96.862A2.5,2.5 0 1 1 232.64,96.862Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M254.17,75.552A2.5,2.5 0 1 1 249.17,75.552A2.5,2.5 0 1 1 254.17,75.552Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M290.02,91.382A2.5,2.5 0 1 1 285.02,91.382A2.5,2.5 0 1 1 290.02,91.382Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M313.96,121.71A2.5,2.5 0 1 1 308.96,121.71A2.5,2.5 0 1 1 313.96,121.71Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M354.26,98.7A2.5,2.5 0 1 1 349.26,98.7A2.5,2.5 0 1 1 354.26,98.7Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M400,182.6A2.5,2.5 0 1 1 395,182.6A2.5,2.5 0 1 1 400,182.6Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<path d=\"M57.169,109.64L98.751,92.64L105.46,55.949L119.34,83.728L133.07,124.53L139.31,64.35L183.15,125.42L202.21,137.25L209.7,81.321L230.03,82.487L255.24,153.26L298.52,136.9L323.72,156.81L337.54,130L340.78,94.047\" style=\"fill:none;stroke:#7AC36A;stroke-dasharray:6,2\" />\n",
       "<path d=\"M55.035,107.5L59.303,107.5L59.303,111.77L55.035,111.77Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M96.617,90.507L100.88,90.507L100.88,94.774L96.617,94.774Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M103.32,53.815L107.59,53.815L107.59,58.082L103.32,58.082Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M117.21,81.594L121.48,81.594L121.48,85.862L117.21,85.862Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M130.94,122.39L135.2,122.39L135.2,126.66L130.94,126.66Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M137.17,62.216L141.44,62.216L141.44,66.483L137.17,66.483Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M181.01,123.29L185.28,123.29L185.28,127.55L181.01,127.55Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M200.07,135.11L204.34,135.11L204.34,139.38L200.07,139.38Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M207.57,79.187L211.83,79.187L211.83,83.455L207.57,83.455Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M227.9,80.353L232.16,80.353L232.16,84.621L227.9,84.621Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M253.1,151.12L257.37,151.12L257.37,155.39L253.1,155.39Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M296.38,134.77L300.65,134.77L300.65,139.04L296.38,139.04Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M321.58,154.68L325.85,154.68L325.85,158.94L321.58,158.94Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M335.4,127.86L339.67,127.86L339.67,132.13L335.4,132.13Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M338.65,91.913L342.92,91.913L342.92,96.181L338.65,96.181Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<path d=\"M51.213,96.769L66.633,92.392L82.966,56.714L87.957,51.774L133.7,102.46L156.27,142.85L194.75,68.156L199.03,90.686L238.11,92.553L280.48,168.9L295.94,82.386L308.12,132.24L338.6,138L367.89,160.44L383.57,184.21\" style=\"fill:none;stroke:#5A9BD4;stroke-dasharray:2,2\" />\n",
       "<path d=\"M51.213,99.894L48.507,95.206L53.919,95.206Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M66.633,95.517L63.927,90.829L69.34,90.829Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M82.966,59.839L80.26,55.152L85.672,55.152Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M87.957,54.899L85.25,50.211L90.663,50.211Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M133.7,105.59L131,100.9L136.41,100.9Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M156.27,145.97L153.56,141.29L158.98,141.29Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M194.75,71.281L192.05,66.593L197.46,66.593Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M199.03,93.811L196.33,89.124L201.74,89.124Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M238.11,95.678L235.4,90.991L240.82,90.991Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M280.48,172.03L277.77,167.34L283.19,167.34Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M295.94,85.511L293.23,80.823L298.64,80.823Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M308.12,135.36L305.41,130.67L310.82,130.67Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M338.6,141.13L335.89,136.44L341.31,136.44Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M367.89,163.57L365.19,158.88L370.6,158.88Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M383.57,187.34L380.87,182.65L386.28,182.65Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<path d=\"M380,63.072L400,63.072\" style=\"fill:none;stroke:#F15A60\" />\n",
       "<path d=\"M392.5,63.072A2.5,2.5 0 1 1 387.5,63.072A2.5,2.5 0 1 1 392.5,63.072Z\" style=\"fill:none;stroke:#F15A60;stroke-width:0.5\" />\n",
       "<text x=\"354.99\" y=\"-60.585\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:12px\">First</text>\n",
       "<path d=\"M380,52.889L400,52.889\" style=\"fill:none;stroke:#7AC36A;stroke-dasharray:6,2\" />\n",
       "<path d=\"M387.87,50.755L392.13,50.755L392.13,55.023L387.87,55.023Z\" style=\"fill:none;stroke:#7AC36A;stroke-width:0.5\" />\n",
       "<text x=\"341.67\" y=\"-50.401\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:12px\">Second</text>\n",
       "<path d=\"M380,42.705L400,42.705\" style=\"fill:none;stroke:#5A9BD4;stroke-dasharray:2,2\" />\n",
       "<path d=\"M390,45.83L387.29,41.143L392.71,41.143Z\" style=\"fill:none;stroke:#5A9BD4;stroke-width:0.5\" />\n",
       "<text x=\"350.34\" y=\"-40.218\" transform=\"scale(1, -1)\"\n",
       "\tstyle=\"font-family:Liberation Serif;font-variant:normal;font-weight:normal;font-style:normal;font-size:12px\">Third</text>\n",
       "</g>\n",
       "</svg>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%\n",
    "gonbui.DisplaySvg(string(GonumPlotExample(400, 200, \"svg\")))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "565909db-5b70-442e-a717-2873f21410c5",
   "metadata": {},
   "source": [
    "### Plotting with [Plotly](https://plotly.com/)\n",
    "\n",
    "[Plotly](https://plotly.com/) has really fancy plots, worth exploring for generating exquisite reports.\n",
    "\n",
    "Currently supported using [`github.com/MetalBlueberry/go-plotly`](https://github.com/MetalBlueberry/go-plotly) library.\n",
    "\n",
    "**Experimental**: but if you bump into any issues please report, and we'll try to fix it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "ae872acc-d74d-4215-a7d7-bec772d9c191",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div id=\"bb7ff3e0\"></div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<script charset=\"UTF-8\">\n",
       "(() => {\n",
       "\tconst src=\"https://cdn.plot.ly/plotly-2.34.0.min.js\";\n",
       "\tvar runJSFn = function(module) {\n",
       "\t\t\n",
       "\tif (!module) {\n",
       "\t\tmodule = window.Plotly;\n",
       "\t}\n",
       "\tlet data = JSON.parse('{\"data\":[{\"type\":\"bar\",\"x\":[1,2,3],\"y\":[1,2,3]}],\"layout\":{\"template\":{\"data\":{\"bar\":[{\"error_x\":{\"color\":\"#f2f5fa\"},\"error_y\":{\"color\":\"#f2f5fa\"},\"marker\":{\"line\":{\"color\":\"rgb(17,17,17)\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"bar\"}],\"barpolar\":[{\"marker\":{\"line\":{\"color\":\"rgb(17,17,17)\",\"width\":0.5},\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"barpolar\"}],\"carpet\":[{\"aaxis\":{\"endlinecolor\":\"#A2B1C6\",\"gridcolor\":\"#506784\",\"linecolor\":\"#506784\",\"minorgridcolor\":\"#506784\",\"startlinecolor\":\"#A2B1C6\"},\"baxis\":{\"endlinecolor\":\"#A2B1C6\",\"gridcolor\":\"#506784\",\"linecolor\":\"#506784\",\"minorgridcolor\":\"#506784\",\"startlinecolor\":\"#A2B1C6\"},\"type\":\"carpet\"}],\"choropleth\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"type\":\"choropleth\"}],\"contour\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1,\"#f0f921\"]],\"type\":\"contour\"}],\"contourcarpet\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"type\":\"contourcarpet\"}],\"heatmap\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1,\"#f0f921\"]],\"type\":\"heatmap\"}],\"histogram\":[{\"marker\":{\"pattern\":{\"fillmode\":\"overlay\",\"size\":10,\"solidity\":0.2}},\"type\":\"histogram\"}],\"histogram2d\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1,\"#f0f921\"]],\"type\":\"histogram2d\"}],\"histogram2dcontour\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1,\"#f0f921\"]],\"type\":\"histogram2dcontour\"}],\"mesh3d\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"type\":\"mesh3d\"}],\"parcoords\":[{\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"parcoords\"}],\"pie\":[{\"automargin\":true,\"type\":\"pie\"}],\"scatter\":[{\"marker\":{\"line\":{\"color\":\"#283442\"}},\"type\":\"scatter\"}],\"scatter3d\":[{\"line\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scatter3d\"}],\"scattercarpet\":[{\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scattercarpet\"}],\"scattergeo\":[{\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scattergeo\"}],\"scattergl\":[{\"marker\":{\"line\":{\"color\":\"#283442\"}},\"type\":\"scattergl\"}],\"scattermap\":[{\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scattermap\"}],\"scattermapbox\":[{\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scattermapbox\"}],\"scatterpolar\":[{\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scatterpolar\"}],\"scatterpolargl\":[{\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scatterpolargl\"}],\"scatterternary\":[{\"marker\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"type\":\"scatterternary\"}],\"surface\":[{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"},\"colorscale\":[[0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1,\"#f0f921\"]],\"type\":\"surface\"}],\"table\":[{\"cells\":{\"fill\":{\"color\":\"#506784\"},\"line\":{\"color\":\"rgb(17,17,17)\"}},\"header\":{\"fill\":{\"color\":\"#2a3f5f\"},\"line\":{\"color\":\"rgb(17,17,17)\"}},\"type\":\"table\"}]},\"layout\":{\"annotationdefaults\":{\"arrowcolor\":\"#f2f5fa\",\"arrowhead\":0,\"arrowwidth\":1},\"autotypenumbers\":\"strict\",\"coloraxis\":{\"colorbar\":{\"outlinewidth\":0,\"ticks\":\"\"}},\"colorscale\":{\"diverging\":[[0,\"#8e0152\"],[0.1,\"#c51b7d\"],[0.2,\"#de77ae\"],[0.3,\"#f1b6da\"],[0.4,\"#fde0ef\"],[0.5,\"#f7f7f7\"],[0.6,\"#e6f5d0\"],[0.7,\"#b8e186\"],[0.8,\"#7fbc41\"],[0.9,\"#4d9221\"],[1,\"#276419\"]],\"sequential\":[[0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1,\"#f0f921\"]],\"sequentialminus\":[[0,\"#0d0887\"],[0.1111111111111111,\"#46039f\"],[0.2222222222222222,\"#7201a8\"],[0.3333333333333333,\"#9c179e\"],[0.4444444444444444,\"#bd3786\"],[0.5555555555555556,\"#d8576b\"],[0.6666666666666666,\"#ed7953\"],[0.7777777777777778,\"#fb9f3a\"],[0.8888888888888888,\"#fdca26\"],[1,\"#f0f921\"]]},\"colorway\":[\"#636efa\",\"#EF553B\",\"#00cc96\",\"#ab63fa\",\"#FFA15A\",\"#19d3f3\",\"#FF6692\",\"#B6E880\",\"#FF97FF\",\"#FECB52\"],\"font\":{\"color\":\"#f2f5fa\"},\"geo\":{\"bgcolor\":\"rgb(17,17,17)\",\"lakecolor\":\"rgb(17,17,17)\",\"landcolor\":\"rgb(17,17,17)\",\"showlakes\":true,\"showland\":true,\"subunitcolor\":\"#506784\"},\"hoverlabel\":{\"align\":\"left\"},\"hovermode\":\"closest\",\"mapbox\":{\"style\":\"dark\"},\"paper_bgcolor\":\"rgb(17,17,17)\",\"plot_bgcolor\":\"rgb(17,17,17)\",\"polar\":{\"angularaxis\":{\"gridcolor\":\"#506784\",\"linecolor\":\"#506784\",\"ticks\":\"\"},\"bgcolor\":\"rgb(17,17,17)\",\"radialaxis\":{\"gridcolor\":\"#506784\",\"linecolor\":\"#506784\",\"ticks\":\"\"}},\"scene\":{\"xaxis\":{\"backgroundcolor\":\"rgb(17,17,17)\",\"gridcolor\":\"#506784\",\"gridwidth\":2,\"linecolor\":\"#506784\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"#C8D4E3\"},\"yaxis\":{\"backgroundcolor\":\"rgb(17,17,17)\",\"gridcolor\":\"#506784\",\"gridwidth\":2,\"linecolor\":\"#506784\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"#C8D4E3\"},\"zaxis\":{\"backgroundcolor\":\"rgb(17,17,17)\",\"gridcolor\":\"#506784\",\"gridwidth\":2,\"linecolor\":\"#506784\",\"showbackground\":true,\"ticks\":\"\",\"zerolinecolor\":\"#C8D4E3\"}},\"shapedefaults\":{\"line\":{\"color\":\"#f2f5fa\"}},\"sliderdefaults\":{\"bgcolor\":\"#C8D4E3\",\"bordercolor\":\"rgb(17,17,17)\",\"borderwidth\":1,\"tickwidth\":0},\"ternary\":{\"aaxis\":{\"gridcolor\":\"#506784\",\"linecolor\":\"#506784\",\"ticks\":\"\"},\"baxis\":{\"gridcolor\":\"#506784\",\"linecolor\":\"#506784\",\"ticks\":\"\"},\"bgcolor\":\"rgb(17,17,17)\",\"caxis\":{\"gridcolor\":\"#506784\",\"linecolor\":\"#506784\",\"ticks\":\"\"}},\"title\":{\"x\":0.05},\"updatemenudefaults\":{\"bgcolor\":\"#506784\",\"borderwidth\":0},\"xaxis\":{\"automargin\":true,\"gridcolor\":\"#283442\",\"linecolor\":\"#506784\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"#283442\",\"zerolinewidth\":2},\"yaxis\":{\"automargin\":true,\"gridcolor\":\"#283442\",\"linecolor\":\"#506784\",\"ticks\":\"\",\"title\":{\"standoff\":15},\"zerolinecolor\":\"#283442\",\"zerolinewidth\":2}}},\"title\":{\"text\":\"A Figure Specified By Go Struct\"}}}');\n",
       "\tmodule.newPlot('bb7ff3e0', data);\n",
       "\n",
       "\t}\n",
       "\t\n",
       "    if (typeof requirejs === \"function\") {\n",
       "        // Use RequireJS to load module.\n",
       "\t\tlet srcWithoutExtension = src.substring(0, src.lastIndexOf(\".js\"));\n",
       "        requirejs.config({\n",
       "            paths: {\n",
       "                'plotly': srcWithoutExtension\n",
       "            }\n",
       "        });\n",
       "        require(['plotly'], function(plotly) {\n",
       "            runJSFn(plotly)\n",
       "        });\n",
       "        return\n",
       "    }\n",
       "\n",
       "\tvar currentScripts = document.head.getElementsByTagName(\"script\");\n",
       "\tfor (const idx in currentScripts) {\n",
       "\t\tlet script = currentScripts[idx];\n",
       "\t\tif (script.src == src) {\n",
       "\t\t\trunJSFn(null);\n",
       "\t\t\treturn;\n",
       "\t\t}\n",
       "\t}\n",
       "\n",
       "\tvar script = document.createElement(\"script\");\n",
       "\n",
       "\tscript.charset = \"utf-8\";\n",
       "\t\n",
       "\tscript.src = src;\n",
       "\tscript.onload = script.onreadystatechange = function () { runJSFn(null); };\n",
       "\tdocument.head.appendChild(script);\t\n",
       "})();\n",
       "</script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import (\n",
    "    \"github.com/janpfeifer/gonb/gonbui/plotly\"\n",
    "\tgrob \"github.com/MetalBlueberry/go-plotly/generated/v2.34.0/graph_objects\"\n",
    "\tptypes \"github.com/MetalBlueberry/go-plotly/pkg/types\"\n",
    ")\n",
    "\n",
    "%%\n",
    "fig := &grob.Fig{\n",
    "    Data: []ptypes.Trace{\n",
    "        &grob.Bar{\n",
    "            X: ptypes.DataArray([]float64{1, 2, 3}),\n",
    "            Y: ptypes.DataArray([]float64{1, 2, 3}),\n",
    "        },\n",
    "    },\n",
    "    Layout: &grob.Layout{\n",
    "        Title: &grob.LayoutTitle{\n",
    "            Text: \"A Figure Specified By Go Struct\",\n",
    "        },\n",
    "        Template: plotly.PlotlyDarkTheme,\n",
    "    },\n",
    "}\n",
    "plotly.DisplayFig(fig)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aadf447d-22e4-486f-a749-36834d9bf24c",
   "metadata": {},
   "source": [
    "### Desktop App Development with Fyne\n",
    "\n",
    "If using a Jupyter-Lab ran with access to X11, one can also experiment with desktop UI programs. Let's try the [*Hello World*](https://developer.fyne.io/started/hello) from [Fyne](https://fyne.io/), a popular, high quality graphical application toolkit for Go.\n",
    "\n",
    "> **Important Note**: Disabled by default: since this have many requirements, and won't run in a test environment. But feel free to\n",
    "> copy&paste the code to a new cell and run it!\n",
    "\n",
    "> **Note 1**: Fyne needs to link many C++ libraries, so the firt time this is used it takes a few minutes to compile everything. But\n",
    "> afterwards it becomes immediate and interactive.\n",
    "\n",
    "> **Note 2**: To compile it it requires some libraries present in the system. See [Fyne's Getting Started](https://developer.fyne.io/started/).\n",
    "\n",
    "> **Note 3**: Remember to close the newly created small \"Hello World!\" window: GoNB is blocking while running a cell, and the cell only finishes to execute when the window is closed. Here we add a timeout just in case.\n",
    "\n",
    "```go\n",
    "import (\n",
    "    \"log\"\n",
    "    \"time\"\n",
    "\n",
    "    \"fyne.io/fyne/v2/app\"\n",
    "    \"fyne.io/fyne/v2/widget\"\n",
    ")\n",
    "\n",
    "%%\n",
    "a := app.New()\n",
    "w := a.NewWindow(\"Hello World\")\n",
    "go func() {\n",
    "    <- time.Tick(10 * time.Second)\n",
    "    log.Printf(\"Timed out, exiting...\")\n",
    "    os.Exit(1)\n",
    "}()\n",
    "\n",
    "w.SetContent(widget.NewLabel(\"Hello World!\"))\n",
    "w.ShowAndRun()\n",
    "fmt.Println(\"Goodbye!\")\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcccb4f1-a9b6-40e4-9d57-013e7103c4a9",
   "metadata": {},
   "source": [
    "## Init Functions\n",
    "\n",
    "Since there is always only one definition per function name, it's not possible for\n",
    "each cell to have it's own init() function.\n",
    "Instead GoNB converts any function named `func init_something()` to `init()` before\n",
    "compiling and executing the cells. \n",
    "This way each cell can create its own `func init_...()` and have it called at every\n",
    "cell execution.\n",
    "\n",
    "Example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "03452fc9-f43c-4fb1-b1ce-50df961a214d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init_a\n",
      "main\n"
     ]
    }
   ],
   "source": [
    "func init_a() {\n",
    "    fmt.Println(\"init_a\")\n",
    "}\n",
    "%%\n",
    "fmt.Println(\"main\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "13a230fd-1179-4ec3-b24c-4f89e0913920",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init_a\n",
      "init_b\n",
      "main\n"
     ]
    }
   ],
   "source": [
    "func init_b() {\n",
    "    fmt.Println(\"init_b\")\n",
    "}\n",
    "%%\n",
    "fmt.Println(\"main\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "00882646-c238-48e1-a2ee-18944d9fd302",
   "metadata": {},
   "source": [
    "Now, we don't want to have `init_a` and `init_b` on all of our cells below. So we remove those definitions -- see how to manage memorized definitions using `%help`, in the \"Managing Memorized Definitions\" section, it's displayed at the end of the tutorial."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "0b8683aa-0bf0-4058-8992-1c5b9e2c2b0c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ". removed func init_a\n",
      ". removed func init_b\n"
     ]
    }
   ],
   "source": [
    "%rm init_a init_b"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0037e1db-61a2-4fd8-bc6f-d8a45eda5b5d",
   "metadata": {},
   "source": [
    "## Flags\n",
    "\n",
    "The `%%` command can also be used to set arguments to the execution of the cell. This makes it easy to configure \n",
    "different runs of the same code using flags. This is something handy when testing or developing code that is shared\n",
    "with a normal code that already used flags.\n",
    "\n",
    "Also,`%%` not only wraps the code following it in a `func main() { ... }` but also automatically adds a call to `flag.Parse()`. \n",
    "\n",
    "Example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "4e2e9992-3a74-4825-87d8-773bdc30b05f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello world!\n"
     ]
    }
   ],
   "source": [
    "import (\n",
    "    \"flag\"\n",
    "    \"fmt\"\n",
    ")\n",
    "\n",
    "var flagWho = flag.String(\"who\", \"\", \"Your name!\")\n",
    "\n",
    "%% --who=world\n",
    "fmt.Printf(\"Hello %s!\\n\", *flagWho)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d42c111-54f3-4a1d-b99d-4005ac49f9e5",
   "metadata": {},
   "source": [
    "Alternatively one can also set the arguments for execution with `%args`, if not using `%%`, as in:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "27c7aaad-b0d3-46f0-b1f6-dc66722fe5bd",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Where is Wally?"
     ]
    }
   ],
   "source": [
    "%args --who=Wally\n",
    "\n",
    "func main() {\n",
    "    flag.Parse()\n",
    "    fmt.Printf(\"Where is %s?\", *flagWho)\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "871031ff-5012-4d49-a398-9c7e1a7614ca",
   "metadata": {},
   "source": [
    "## Interacting with the DOM \n",
    "\n",
    "The package `gonbui/dom` allows one to manipulate the DOM in the browser in arbitrary ways. \n",
    "\n",
    "It is very useful if implementing new widgets. Things to check out for:\n",
    "\n",
    "* `dom.TransientJavascript`: Executes Javascript in a transient cell output and then erases it (so it's not saved with the notebook).\n",
    "* `dom.Append`: Appends HTML to a any element identified by an Id.\n",
    "* `dom.SetInnerHtml` and `dom.GetInnerHtml`: Manipulate the `innerHTML` of any element.\n",
    "* `dom.Persist`: Takes the `innerHTML` of a transient element, and then displays it normally with `gonbui.DisplayHtml`, so it can be saved with the notebook. Useful if using Javascript libraries (plotting for instance) that dyncamically generate content.\n",
    "\n",
    "Check the library documentation for more! "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f873cdb6-9bc7-45a0-9d93-2053099498d8",
   "metadata": {},
   "source": [
    "## Widgets\n",
    "\n",
    "**GoNB** allows you to use the browser not only to output rich content (HTML, Widgets), but also interact with HTML UI elements.\n",
    "\n",
    "It provides the `widgets` package with a few basic widgets for you to use, and a `gonbui/comms` package that you can use to create new widgets -- see `docs/FrontEndCommunication.md` file for more details on that.\n",
    "\n",
    "Let's reuse our Sine curve plotting function below, and connect it to a slider. And then\n",
    "create a button to stop the interaction when we are done.\n",
    "\n",
    "(To allow this notebook to run automatically, we add a timeout -- if your playing with\n",
    "the tutorial with a live Jupyter Notebook, feel free to change it or remove the timeout)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "632205e9-a72c-4e1a-a429-6a02394ce44a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div id=\"dom.transient_div_d691d2c8\"></div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<input type=\"range\" id=\"gonb_slider_a7de08eb\" min=\"0\" max=\"100\" value=\"50\">&nbsp;<span id=\"sin_freq\" style=\"font-family: monospace; font-style: italic; font-size: small; border: 1px solid; border-style: inset; padding-right:5px;\">  5.50</span>&nbsp;<button id=\"gonb_button_4009b829\" type=\"button\">Ok</button>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<svg viewbox=\"0 0 800 240\" style=\"background-color:#f8f8f8\" preserveAspectRatio=\"xMidYMid meet\" xmlns=\"http://www.w3.org/2000/svg\" width=\"800\" height=\"240\"><defs><marker markerWidth=\"2%\" markerHeight=\"2%\" id=\"circle\" viewBox=\"0 0 10 10 \" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\"><circle stroke=\"black\" cx=\"5\" cy=\"5\" r=\"3\" fill=\"none\"/></marker><marker markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\" id=\"filled-circle\" viewBox=\"0 0 10 10 \" refX=\"5\" refY=\"5\"><circle cx=\"5\" cy=\"5\" r=\"3\" fill=\"black\" stroke=\"none\"/></marker><marker id=\"square\" viewBox=\"0 0 10 10 \" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\"><rect width=\"6\" height=\"6\" fill=\"none\" stroke=\"black\" x=\"2\" y=\"2\"/></marker><marker refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"2%\" markerHeight=\"2%\" id=\"filled-square\" viewBox=\"0 0 10 10 \"><rect height=\"6\" fill=\"black\" stroke=\"none\" x=\"2\" y=\"2\" width=\"6\"/></marker></defs><g stroke=\"hsl(198, 47%, 65%)\" stroke-width=\"3.14px\" stroke-linecap=\"round\" stroke-linejoin=\"round\" transform=\"translate(64 176 )scale(1 -1 )\" fill=\"none\"><path d=\"M0.000000e+00,5.601382e+01 C1.131313e+00,5.917615e+01 4.525253e+00,6.903707e+01 6.787879e+00,7.498782e+01 C9.050505e+00,8.093858e+01 1.131313e+01,8.684513e+01 1.357576e+01,9.171837e+01 C1.583838e+01,9.659161e+01 1.810101e+01,1.010078e+02 2.036364e+01,1.042273e+02 C2.262626e+01,1.074468e+02 2.488889e+01,1.098504e+02 2.715152e+01,1.110355e+02 C2.941414e+01,1.122206e+02 3.167677e+01,1.123274e+02 3.393939e+01,1.113380e+02 C3.620202e+01,1.103486e+02 3.846465e+01,1.081460e+02 4.072727e+01,1.050991e+02 C4.298990e+01,1.020522e+02 4.525253e+01,9.780063e+01 4.751515e+01,9.305642e+01 C4.977778e+01,8.831222e+01 5.204040e+01,8.251441e+01 5.430303e+01,7.663388e+01 C5.656566e+01,7.075335e+01 5.882828e+01,6.409480e+01 6.109091e+01,5.777326e+01 C6.335354e+01,5.145171e+01 6.561616e+01,4.471971e+01 6.787879e+01,3.870460e+01 C7.014141e+01,3.268948e+01 7.240404e+01,2.668002e+01 7.466667e+01,2.168255e+01 C7.692929e+01,1.668509e+01 7.919192e+01,1.210871e+01 8.145455e+01,8.719788e+00 C8.371717e+01,5.330861e+00 8.597980e+01,2.728678e+00 8.824242e+01,1.348994e+00 C9.050505e+01,-3.068948e-02 9.276768e+01,-3.510054e-01 9.503030e+01,4.416857e-01 C9.729293e+01,1.234377e+00 9.955556e+01,3.233802e+00 1.018182e+02,6.105141e+00 C1.040808e+02,8.976480e+00 1.063434e+02,1.305924e+01 1.086061e+02,1.766972e+01 C1.108687e+02,2.228021e+01 1.131313e+02,2.796356e+01 1.153939e+02,3.376805e+01 C1.176566e+02,3.957254e+01 1.199192e+02,4.618449e+01 1.221818e+02,5.249668e+01 C1.244444e+02,5.880887e+01 1.267071e+02,6.556764e+01 1.289697e+02,7.164118e+01 C1.312323e+02,7.771472e+01 1.334949e+02,8.382115e+01 1.357576e+02,8.893792e+01 C1.380202e+02,9.405468e+01 1.402828e+02,9.878677e+01 1.425455e+02,1.023418e+02 C1.448081e+02,1.058968e+02 1.470707e+02,1.086950e+02 1.493333e+02,1.102679e+02 C1.515960e+02,1.118407e+02 1.538586e+02,1.123743e+02 1.561212e+02,1.117790e+02 C1.583838e+02,1.111838e+02 1.606465e+02,1.093896e+02 1.629091e+02,1.066966e+02 C1.651717e+02,1.040037e+02 1.674343e+02,1.000938e+02 1.696970e+02,9.562157e+01 C1.719596e+02,9.114936e+01 1.742222e+02,8.558608e+01 1.764848e+02,7.986334e+01 C1.787475e+02,7.414061e+01 1.810101e+02,6.758178e+01 1.832727e+02,6.128519e+01 C1.855354e+02,5.498859e+01 1.877980e+02,4.820972e+01 1.900606e+02,4.208375e+01 C1.923232e+02,3.595778e+01 1.945859e+02,2.976039e+01 1.968485e+02,2.452938e+01 C1.991111e+02,1.929837e+01 2.013737e+02,1.441523e+01 2.036364e+02,1.069769e+01 C2.058990e+02,6.980141e+00 2.081616e+02,3.988629e+00 2.104242e+02,2.224102e+00 C2.126869e+02,4.595761e-01 2.149495e+02,-2.865987e-01 2.172121e+02,1.105305e-01 C2.194747e+02,5.076597e-01 2.217374e+02,2.095049e+00 2.240000e+02,4.606878e+00 C2.262626e+02,7.118706e+00 2.285253e+02,1.085197e+01 2.307879e+02,1.518150e+01 C2.330505e+02,1.951104e+01 2.353131e+02,2.494876e+01 2.375758e+02,3.058408e+01 C2.398384e+02,3.621940e+01 2.421010e+02,4.271863e+01 2.443636e+02,4.899343e+01 C2.466263e+02,5.526822e+01 2.488889e+02,6.206051e+01 2.511515e+02,6.823286e+01 C2.534141e+02,7.440521e+01 2.556768e+02,8.068743e+01 2.579394e+02,8.602753e+01 C2.602020e+02,9.136762e+01 2.624646e+02,9.639699e+01 2.647273e+02,1.002734e+02 C2.669899e+02,1.041499e+02 2.692525e+02,1.073317e+02 2.715152e+02,1.092861e+02 C2.737778e+02,1.112406e+02 2.760404e+02,1.121987e+02 2.783030e+02,1.120000e+02 C2.805657e+02,1.118013e+02 2.828283e+02,1.104224e+02 2.850909e+02,1.080942e+02 C2.873535e+02,1.057659e+02 2.896162e+02,1.022130e+02 2.918788e+02,9.803041e+01 C2.941414e+02,9.384783e+01 2.964040e+02,8.854103e+01 2.986667e+02,8.299868e+01 C3.009293e+02,7.745633e+01 3.031919e+02,7.102311e+01 3.054545e+02,6.477631e+01 C3.077172e+02,5.852951e+01 3.099798e+02,5.173052e+01 3.122424e+02,4.551788e+01 C3.145051e+02,3.930524e+01 3.167677e+02,3.294437e+01 3.190303e+02,2.750047e+01 C3.212929e+02,2.205656e+01 3.235556e+02,1.688593e+01 3.258182e+02,1.285443e+01 C3.280808e+02,8.822935e+00 3.303434e+02,5.453899e+00 3.326061e+02,3.311494e+00 C3.348687e+02,1.169089e+00 3.371313e+02,4.144833e-15 3.393939e+02,0.000000e+00 C3.416566e+02,-4.144833e-15 3.439192e+02,1.169089e+00 3.461818e+02,3.311494e+00 C3.484444e+02,5.453899e+00 3.507071e+02,8.822935e+00 3.529697e+02,1.285443e+01 C3.552323e+02,1.688593e+01 3.574949e+02,2.205656e+01 3.597576e+02,2.750047e+01 C3.620202e+02,3.294437e+01 3.642828e+02,3.930524e+01 3.665455e+02,4.551788e+01 C3.688081e+02,5.173052e+01 3.710707e+02,5.852951e+01 3.733333e+02,6.477631e+01 C3.755960e+02,7.102311e+01 3.778586e+02,7.745633e+01 3.801212e+02,8.299868e+01 C3.823838e+02,8.854103e+01 3.846465e+02,9.384783e+01 3.869091e+02,9.803041e+01 C3.891717e+02,1.022130e+02 3.914343e+02,1.057659e+02 3.936970e+02,1.080942e+02 C3.959596e+02,1.104224e+02 3.982222e+02,1.118013e+02 4.004848e+02,1.120000e+02 C4.027475e+02,1.121987e+02 4.050101e+02,1.112406e+02 4.072727e+02,1.092861e+02 C4.095354e+02,1.073317e+02 4.117980e+02,1.041499e+02 4.140606e+02,1.002734e+02 C4.163232e+02,9.639699e+01 4.185859e+02,9.136762e+01 4.208485e+02,8.602753e+01 C4.231111e+02,8.068743e+01 4.253737e+02,7.440521e+01 4.276364e+02,6.823286e+01 C4.298990e+02,6.206051e+01 4.321616e+02,5.526822e+01 4.344242e+02,4.899343e+01 C4.366869e+02,4.271863e+01 4.389495e+02,3.621940e+01 4.412121e+02,3.058408e+01 C4.434747e+02,2.494876e+01 4.457374e+02,1.951104e+01 4.480000e+02,1.518150e+01 C4.502626e+02,1.085197e+01 4.525253e+02,7.118706e+00 4.547879e+02,4.606878e+00 C4.570505e+02,2.095049e+00 4.593131e+02,5.076597e-01 4.615758e+02,1.105305e-01 C4.638384e+02,-2.865987e-01 4.661010e+02,4.595761e-01 4.683636e+02,2.224102e+00 C4.706263e+02,3.988629e+00 4.728889e+02,6.980141e+00 4.751515e+02,1.069769e+01 C4.774141e+02,1.441523e+01 4.796768e+02,1.929837e+01 4.819394e+02,2.452938e+01 C4.842020e+02,2.976039e+01 4.864646e+02,3.595778e+01 4.887273e+02,4.208375e+01 C4.909899e+02,4.820972e+01 4.932525e+02,5.498859e+01 4.955152e+02,6.128519e+01 C4.977778e+02,6.758178e+01 5.000404e+02,7.414061e+01 5.023030e+02,7.986334e+01 C5.045657e+02,8.558608e+01 5.068283e+02,9.114936e+01 5.090909e+02,9.562157e+01 C5.113535e+02,1.000938e+02 5.136162e+02,1.040037e+02 5.158788e+02,1.066966e+02 C5.181414e+02,1.093896e+02 5.204040e+02,1.111838e+02 5.226667e+02,1.117790e+02 C5.249293e+02,1.123743e+02 5.271919e+02,1.118407e+02 5.294545e+02,1.102679e+02 C5.317172e+02,1.086950e+02 5.339798e+02,1.058968e+02 5.362424e+02,1.023418e+02 C5.385051e+02,9.878677e+01 5.407677e+02,9.405468e+01 5.430303e+02,8.893792e+01 C5.452929e+02,8.382115e+01 5.475556e+02,7.771472e+01 5.498182e+02,7.164118e+01 C5.520808e+02,6.556764e+01 5.543434e+02,5.880887e+01 5.566061e+02,5.249668e+01 C5.588687e+02,4.618449e+01 5.611313e+02,3.957254e+01 5.633939e+02,3.376805e+01 C5.656566e+02,2.796356e+01 5.679192e+02,2.228021e+01 5.701818e+02,1.766972e+01 C5.724444e+02,1.305924e+01 5.747071e+02,8.976480e+00 5.769697e+02,6.105141e+00 C5.792323e+02,3.233802e+00 5.814949e+02,1.234377e+00 5.837576e+02,4.416857e-01 C5.860202e+02,-3.510054e-01 5.882828e+02,-3.068948e-02 5.905455e+02,1.348994e+00 C5.928081e+02,2.728678e+00 5.950707e+02,5.330861e+00 5.973333e+02,8.719788e+00 C5.995960e+02,1.210871e+01 6.018586e+02,1.668509e+01 6.041212e+02,2.168255e+01 C6.063838e+02,2.668002e+01 6.086465e+02,3.268948e+01 6.109091e+02,3.870460e+01 C6.131717e+02,4.471971e+01 6.154343e+02,5.145171e+01 6.176970e+02,5.777326e+01 C6.199596e+02,6.409480e+01 6.222222e+02,7.075335e+01 6.244848e+02,7.663388e+01 C6.267475e+02,8.251441e+01 6.290101e+02,8.831222e+01 6.312727e+02,9.305642e+01 C6.335354e+02,9.780063e+01 6.357980e+02,1.020522e+02 6.380606e+02,1.050991e+02 C6.403232e+02,1.081460e+02 6.425859e+02,1.103486e+02 6.448485e+02,1.113380e+02 C6.471111e+02,1.123274e+02 6.493737e+02,1.122206e+02 6.516364e+02,1.110355e+02 C6.538990e+02,1.098504e+02 6.561616e+02,1.074468e+02 6.584242e+02,1.042273e+02 C6.606869e+02,1.010078e+02 6.629495e+02,9.659161e+01 6.652121e+02,9.171837e+01 C6.674747e+02,8.684513e+01 6.708687e+02,7.777625e+01 6.720000e+02,7.498782e+01 \" vector-effect=\"non-scaling-stroke\"/></g><g fill=\"none\" stroke=\"black\" stroke-width=\"2px\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"64\" y=\"64\" width=\"672\" height=\"112\" vector-effect=\"non-scaling-stroke\"/><g fill=\"black\" font-family=\"sans-serif\" font-size=\"18px\" font-style=\"normal\" font-weight=\"bold\" dominant-baseline=\"middle\" text-anchor=\"middle\"><text y=\"32\" dominant-baseline=\"middle\" stroke=\"none\" vector-effect=\"non-scaling-stroke\" x=\"400\">Animated Sine</text></g></g></svg>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<p>Done.</p>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import (\n",
    "    \"github.com/janpfeifer/gonb/gonbui\"\n",
    "    \"github.com/janpfeifer/gonb/gonbui/dom\"\n",
    "    \"github.com/janpfeifer/gonb/gonbui/widgets\"    \n",
    ")\n",
    "\n",
    "%%\n",
    "freq := 5.5 // From 1.0 to 10.0, controlled by a slider\n",
    "\n",
    "divId := dom.CreateTransientDiv()\n",
    "slider := widgets.Slider(0, 100, 50).AppendTo(divId).Done()\n",
    "freqHtml := fmt.Sprintf(`&nbsp;<span id=\"sin_freq\" style=\"font-family: monospace; font-style: italic; font-size: small; border: 1px solid; border-style: inset; padding-right:5px;\">%6.2f</span>&nbsp;`, freq)\n",
    "dom.Append(divId, freqHtml)\n",
    "button := widgets.Button(\"Ok\").AppendTo(divId).Done()\n",
    "\n",
    "// Initial plot.\n",
    "htmlCellId := \"sin_plot\"+gonbui.UniqueId()\n",
    "plotSvg := mgSinPlot(800, 240, freq)  // Defined in the cell above.\n",
    "gonbui.UpdateHtml(htmlCellId, plotSvg)\n",
    "\n",
    "// Listen to slider, button and a timeout timer.\n",
    "sliderChan := slider.Listen().LatestOnly()\n",
    "buttonChan := button.Listen()\n",
    "loop:\n",
    "for {\n",
    "    select {\n",
    "    case <- buttonChan.C:\n",
    "        break loop\n",
    "    case value := <-sliderChan.C:\n",
    "        freq := 1.0 + 9.0 * float64(value) / 100.0\n",
    "        dom.SetInnerText(\"sin_freq\", fmt.Sprintf(\"%6.2f\", freq))\n",
    "        plotSvg = mgSinPlot(800, 240, freq)  // Defined in the cell above.\n",
    "        gonbui.UpdateHtml(htmlCellId, plotSvg)\n",
    "    case <- time.After(1000 * time.Millisecond):\n",
    "        break loop\n",
    "    }\n",
    "}\n",
    "\n",
    "// Erase transient UI and image and re-display it so it can be persisted.\n",
    "gonbui.UpdateHtml(htmlCellId, \"\")\n",
    "dom.Persist(divId)\n",
    "gonbui.DisplayHtml(plotSvg)\n",
    "gonbui.DisplayHtml(\"<p>Done.</p>\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "626a3bd7-35c8-424d-af44-005940178224",
   "metadata": {},
   "source": [
    "### User Input\n",
    "\n",
    "There are different ways to provide input to a program in GoNB. We list them below and introduce a new one:\n",
    "\n",
    "1. Simply define constants or variables in the cell and use them. The cell itself is a good way to enter input.\n",
    "2. Add flags, and pass the values of flags after the `%%` command. For instance `%% --x=10` will run your cell with the flag `x` set to 10. This is handy for instance to test a function with different values, each one in a different cell.\n",
    "3. Read the input from an external file. One can edit the file in Jupyter or another text editor. It's easy to set `os.Stdin` to the desired file.\n",
    "4. Use HTML widgets (see `gonbui/widgets` package, described above).\n",
    "5. Jupyter Notebooks also provides a form of input request, where it displays an in-place text box. The `gonbui` package has a function to do that, the results of which can be read in from the `stdin` afterwards. See the following example:\n",
    "\n",
    "```go\n",
    "import (\n",
    "    \"fmt\"\n",
    "    \"github.com/janpfeifer/gonb/gonbui\"\n",
    ")\n",
    "\n",
    "%%\n",
    "gonbui.RequestInput(\"Tell me a number: \", false)\n",
    "var x int\n",
    "_, err := fmt.Scan(&x)\n",
    "if err != nil { panic(err) }\n",
    "fmt.Printf(\"The number you typed was %d\\n\", x)\n",
    "\n",
    "gonbui.RequestInput(\"Tell me a secret: \", true)\n",
    "var secret string\n",
    "_, err = fmt.Scan(&secret)\n",
    "if err != nil { panic(err) }\n",
    "fmt.Printf(\"Shh! Your secret was %q\\n\", secret)\n",
    "```\n",
    "\n",
    "The output would be something like:\n",
    "\n",
    "```\n",
    "Tell me a number:  42\n",
    "The number you typed was 42\n",
    "Tell me a secret:  ······\n",
    "Shh! Your secret was \"I🧡GoNB!\"\n",
    "```\n",
    "\n",
    "> **Note**: Not executed by default because it breaks the automatic tests, but try it out on a new cell!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2e0a724-0594-4462-88a4-6856a0dc2cb4",
   "metadata": {},
   "source": [
    "## Executing Shell Commands\n",
    "\n",
    "There are two variations to execute shell commands. They differ only on the directory\n",
    "from where they are executed.\n",
    "\n",
    "* `!` prefix executes what comes next should be executed as a shell command, on the same directory\n",
    "  where the kernel is executed -- typically the same directory where the notebook files is saved.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "724e33f4-c5fa-4fbe-9d90-e411369a74f3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "go version go1.24.2 linux/amd64\n",
      "/home/janpf/Projects/gonb/examples\n",
      "total 352\n",
      "-rw-rw-r-- 1 janpf janpf 108240 Sep 23  2024 google_colab_demo.ipynb\n",
      "drwxr-xr-x 3 janpf janpf   4096 Jun  1 11:41 tests\n",
      "-rw-r--r-- 1 janpf janpf 232436 Jun  1 12:00 tutorial.ipynb\n",
      "-rw-r--r-- 1 janpf janpf  10090 Dec 15  2023 wasm_demo.ipynb\n"
     ]
    }
   ],
   "source": [
    "!go version\n",
    "!pwd ; ls -l"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58a9dd1a-c30a-4d89-aada-efb91a989f20",
   "metadata": {},
   "source": [
    "* `!*` prefix executes what comes next as a shell command, on the temporary directory used \n",
    "  to compile the *Go* program when executing the cells. This includes the `go.mod` file, that\n",
    "  can be manipulated for special use cases, like importing a specific version of a module, \n",
    "  or to `redirect` a module to a local directory for development (see `Replace` section below)\n",
    "  \n",
    "Example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "be207993-219d-4a7f-a130-5111971fb867",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/tmp/gonb_f2fb06a5\n",
      "total 14736\n",
      "-rw-r--r-- 1 janpf janpf     1358 Jun  1 12:00 go.mod\n",
      "-rwxr-xr-x 1 janpf janpf 15068580 Jun  1 12:01 gonb_f2fb06a5\n",
      "srwxr-xr-x 1 janpf janpf        0 Jun  1 12:00 gopls_socket\n",
      "-rw-r--r-- 1 janpf janpf     7809 Jun  1 12:00 go.sum\n",
      "-rw-r--r-- 1 janpf janpf     6177 Jun  1 12:01 main.go\n"
     ]
    }
   ],
   "source": [
    "!*pwd ; ls -l"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7155d4a-1076-4b63-bee5-bf0ae2baaeec",
   "metadata": {},
   "source": [
    "You can also use a `\\` at the end of the line to extend the shell command to multiple lines.\n",
    "\n",
    "Example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "8688859a-ec3b-4e54-99b4-abbd8542091d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counting: 4 ...\n"
     ]
    }
   ],
   "source": [
    "!((ii=0)) ;\\\n",
    "while ((ii < 5)) ; do \\\n",
    "  printf \"\\rCounting: ${ii} ...\" ;\\\n",
    "  sleep 1;\\\n",
    "  ((ii+=1));\\\n",
    "done;\\\n",
    "echo"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81f89ec8-242c-4acf-9ece-af896fb1ad5f",
   "metadata": {},
   "source": [
    "If some shell program requires some input from the user, you can precede it with a `%with_inputs` or `%with_password` (for hidden input) and it will open a text field for typing some arbitrary text input. Example:\n",
    "\n",
    "```shell\n",
    "%with_password\n",
    "!sudo -S apt update\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4b125e1-f0e2-4180-8029-644208c59270",
   "metadata": {},
   "source": [
    "## Debugging A Cell\n",
    "\n",
    "While **GoNB** doesn't (yet) talk the debug protocol with JupyterLab, it's easy to start a GUI debugger\n",
    "from a cell, if being executed on the same machine as the browser.\n",
    "\n",
    "The common Go debugger recommendation is [delve](https://github.com/go-delve/delve), and in particular its front-end\n",
    "[gdlv](https://github.com/aarzilli/gdlv). And to make it simpler **GoNB** includes a small wrapper script \n",
    "[`ndlv`](https://github.com/janpfeifer/gonb/blob/main/cmd/ndlv/ndlv) to\n",
    "set the directory and program name to the last cell executed. Copy or link that script somewhere in your `PATH`\n",
    "(maybe `${HOME}/bin` if you have such directory set up).\n",
    "\n",
    "To open the debugger, after executing a cell you want to debug, you create and execute a new cell with this single shell command:\n",
    "\n",
    "```\n",
    "!ndlv\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "514b3ca4-3a1e-4b14-964b-ed8efa4f1d3e",
   "metadata": {},
   "source": [
    "## Environment Variables\n",
    "\n",
    "For convenience, **GoNB** defines the following environment variables -- available for the shell scripts (`!` and `!*`) and for the _Go_ cells:\n",
    "\n",
    "* `GONB_DIR`: the directory where commands are executed from. This can be changed with `%cd`.\n",
    "* `GONB_TMP_DIR`: the directory where the temporary Go code, with the cell code, is stored and compiled. This is the directory where `!*` scripts are executed. It only changes when a kernel is restarted, and a new temporary directory is created.\n",
    "* `GONB_PIPE`: is the _named pipe_ directory used to communicate rich content (HTML, images) to the kernel. Only available for _Go_ cells, and a new one is created at every execution. This is used by the `gonbui` functions described above, and doesn't need to be accessed directly."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b49634dd-4703-4a3f-88c7-a8687ee35369",
   "metadata": {},
   "source": [
    "## Tests and Benchmarks\n",
    "\n",
    "**GoNB** allows also executing the cell with `go test`, to demo or debug tests and benchmarks. For that just mark the cell with `%test` and if no other parameters are given, it will run the tests and benchmarks defined in the current cell.\n",
    "\n",
    "If it is the only command in the cell, it will run all tests defined so far. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "02dbf874-ab19-4fb8-8d91-901dadac808c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== RUN   TestIncr\n",
      "--- PASS: TestIncr (0.00s)\n",
      "goos: linux\n",
      "goarch: amd64\n",
      "pkg: gonb_f2fb06a5\n",
      "cpu: AMD Ryzen 9 9950X3D 16-Core Processor          \n",
      "BenchmarkIncr\n",
      "BenchmarkIncr-32    \t1000000000\t         0.1787 ns/op\n",
      "PASS\n"
     ]
    }
   ],
   "source": [
    "import \"github.com/stretchr/testify/require\"\n",
    "\n",
    "func TestIncr(t *testing.T) {\n",
    "    require.Equal(t, 2, incr(1))    \n",
    "}\n",
    "\n",
    "func BenchmarkIncr(b *testing.B) {\n",
    "    for i := 0; i < b.N; i++ {\n",
    "        _ = incr(i)\n",
    "    }\n",
    "}\n",
    "\n",
    "%test"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "25230a6f-9412-4cde-8759-b6058d10e012",
   "metadata": {},
   "source": [
    "Alternatively, you can provide extra flags that are passed to the test binary. For instance, to execute all benchmarks defined so far, use:\n",
    "\n",
    "```\n",
    "%test -test.bench=. -test.run=Bechmark\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc3e1354-7a50-4db9-a82b-ad42d6e9c102",
   "metadata": {},
   "source": [
    "## Developing Go libraries with a notebook: `go.mod` and `go.work`\n",
    "\n",
    "*GoNB* uses `go.mod` and understands `go.work` -- but won't create it by default.\n",
    "\n",
    "### \"Replace\" modules in `go.mod`\n",
    "\n",
    "Using the `!*` command above we can easily \"replace\" a module to a local directory. This can be very handy\n",
    "for developing a library in a powerful IDE on the side, and using the *GoNB* notebook to execute tests\n",
    "and experiments. Changes in the library (in the IDE) when saved immediate take effect on the next cell execution.\n",
    "\n",
    "\n",
    "The accompaining library *gonbui* was implemented mostly in this fashion using a notebook, that started with:\n",
    "\n",
    "```\n",
    "!*go mod edit -replace github.com/janpfeifer/gonb=/home/janpf/Projects/gonb\n",
    "```\n",
    "\n",
    "Check out the results with:\n",
    "\n",
    "```\n",
    "!*cat go.mod\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "3391f12e-131b-45b8-b270-6ba06abaac8c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "module gonb_f2fb06a5\n",
      "\n",
      "go 1.24.2\n",
      "\n",
      "require (\n",
      "\tgithub.com/MetalBlueberry/go-plotly v0.7.0\n",
      "\tgithub.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b\n",
      "\tgithub.com/benc-uk/gofract v0.0.0-20230120162050-a6f644f92fd6\n",
      "\tgithub.com/erkkah/margaid v0.1.1-0.20230128143048-d60b2efd2f5a\n",
      "\tgithub.com/janpfeifer/gonb v0.11.0\n",
      "\tgithub.com/schollz/progressbar/v3 v3.18.0\n",
      "\tgithub.com/stretchr/testify v1.9.0\n",
      "\tgolang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b\n",
      "\tgonum.org/v1/plot v0.16.0\n",
      ")\n",
      "\n",
      "require (\n",
      "\tcodeberg.org/go-fonts/liberation v0.5.0 // indirect\n",
      "\tcodeberg.org/go-latex/latex v0.1.0 // indirect\n",
      "\tcodeberg.org/go-pdf/fpdf v0.10.0 // indirect\n",
      "\tgit.sr.ht/~sbinet/gg v0.6.0 // indirect\n",
      "\tgithub.com/campoy/embedmd v1.0.0 // indirect\n",
      "\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n",
      "\tgithub.com/go-logr/logr v1.4.2 // indirect\n",
      "\tgithub.com/gofrs/uuid v4.4.0+incompatible // indirect\n",
      "\tgithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect\n",
      "\tgithub.com/lucasb-eyer/go-colorful v1.0.3 // indirect\n",
      "\tgithub.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect\n",
      "\tgithub.com/pkg/errors v0.9.1 // indirect\n",
      "\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n",
      "\tgithub.com/rivo/uniseg v0.4.7 // indirect\n",
      "\tgolang.org/x/image v0.25.0 // indirect\n",
      "\tgolang.org/x/sys v0.30.0 // indirect\n",
      "\tgolang.org/x/term v0.28.0 // indirect\n",
      "\tgolang.org/x/text v0.23.0 // indirect\n",
      "\tgopkg.in/yaml.v2 v2.3.0 // indirect\n",
      "\tgopkg.in/yaml.v3 v3.0.1 // indirect\n",
      "\tk8s.io/klog/v2 v2.130.1 // indirect\n",
      ")\n",
      "\n",
      "replace github.com/janpfeifer/gonb => /home/janpf/Projects/gonb\n"
     ]
    }
   ],
   "source": [
    "!*go mod edit -replace \"github.com/janpfeifer/gonb=${HOME}/Projects/gonb\"\n",
    "!*cat go.mod"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e46fc85-fb7a-43dd-9434-43d2d5faded8",
   "metadata": {},
   "source": [
    "### \"Use\" modules in `go.work`\n",
    "\n",
    "Another way to refer to modules that are being co-developed in local file is using [Go workspaces](https://go.dev/doc/tutorial/workspaces).\n",
    "                                                                                                   \n",
    "In **GoNB**, a convenient way to achive this is by first creating a `go.work` and then selecting the modules to be use from the local disk. Example:                                                                                           "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "45cf4a12-4b93-480f-bd83-2d375e7a475d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\t- Replace rule for module \"github.com/janpfeifer/gonb\" to local directory \"/home/janpf/Projects/gonb\" already exists.\n"
     ]
    }
   ],
   "source": [
    "!*rm -f go.work && go work init && go work use . \"${HOME}/Projects/gonb\"\n",
    "%goworkfix"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29f2828e-a7e7-4264-aca8-c47ed4377c17",
   "metadata": {},
   "source": [
    "> **Note**:\n",
    "> - **GoNB** uses `go get` to automatically fetch missing imports.\n",
    ">   Unfortunately `go get` doesn't handle `go.work` `use` definitions.\n",
    ">   The special command `%goworkfix` handles that by adding a `replace` entry in `go.mod` for\n",
    ">   all modules pointed to by `go.work`.\n",
    "> - One can use the env variable `GONB_DIR` to refer to the current kernel directory (changed with `%cd`)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6594c119-e2e9-4d93-a4bd-506b4ab190fc",
   "metadata": {},
   "source": [
    "### Tracked directories\n",
    "\n",
    "**GoNB** tracks for changes in local files in target directories of `replace` rules in `go.mod` or `use` rules in `go.work`. This way auto-complete and contextual help stay up-to-date with changes on local files you may be editing on a separate editor.\n",
    "\n",
    "See `%track` and `%untrack` to list and control tracking. For instance, in our tutorial, this is what **GoNB** is tracking:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "f6d836c1-3dfd-41a0-b097-b157f33289a8",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<b>List of files/directories being tracked:</b>\n",
       "<ul>\n",
       "<li>/home/janpf/Projects/gonb</li>\n",
       "<li>/home/janpf/Projects/gonb/cache</li>\n",
       "<li>/home/janpf/Projects/gonb/cmd/nbexec</li>\n",
       "<li>/home/janpf/Projects/gonb/common</li>\n",
       "<li>/home/janpf/Projects/gonb/gonbui</li>\n",
       "<li>/home/janpf/Projects/gonb/gonbui/comms</li>\n",
       "<li>/home/janpf/Projects/gonb/gonbui/dom</li>\n",
       "<li>/home/janpf/Projects/gonb/gonbui/plotly</li>\n",
       "<li>/home/janpf/Projects/gonb/gonbui/protocol</li>\n",
       "<li>/home/janpf/Projects/gonb/gonbui/wasm</li>\n",
       "<li>/home/janpf/Projects/gonb/gonbui/widgets</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/comms</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/dispatcher</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/goexec</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/goexec/goplsclient</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/jpyexec</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/kernel</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/nbtests</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/specialcmd</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/version</li>\n",
       "<li>/home/janpf/Projects/gonb/internal/websocket</li>\n",
       "<li>/home/janpf/Projects/gonb/version</li>\n",
       "</ul>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%track"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "557c7d2e-4726-453c-9471-2f340d06a1e6",
   "metadata": {},
   "source": [
    "### Custom `go build` flags\n",
    "\n",
    "Sometimes it can be desirable to change the Go flags used to build the cells being executed.\n",
    "For instance to check for coverage, or enable race condition detection, etc.\n",
    "\n",
    "**GoNB** supports this in two ways:\n",
    "\n",
    "1. You can tell **GoNB** to use arbitrary `go build` flags with `%goflags <values ...>`. `%goflags` without any values displays current settings, and `%goflags \"\"` will reset to the default (no extra flags).\n",
    "2. In some cases it's not that one wants **GoNB** to build the binary with the flags, but simply run `go build ...` to see the results. This is supported by simply running `!*go build ...`, which is conveniently executed (the `!*` prefix) in the temporary directory where the cells code maintained by **GoNB** is located (in a `main.go`). E.g.: To look at optimization decisions, use `!*go build -gcflags=-m`.\n",
    "\n",
    "See an example in the `examples/tests/gcflags.ipynb` file, which is used as an integration test."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1c54e53a-037c-451e-9fd4-116d27c58296",
   "metadata": {},
   "source": [
    "## More ... and Help\n",
    "\n",
    "Some other features:\n",
    "\n",
    "* **Errors reported** by the Go compiler are parsed and a **_mouse-over_ context is displayed**. This facilitates understanding the error, since the line numbers reported by Go are not the same as in the cell being executed.\n",
    "* **Contextual Help**: can be activated with **\"Shift+Tab\"\"** (floating note) or **\"Control+I\"** (for a separate sub-window). Notice it may be slow if some new import needs to be fetched -- consider executing once some code with the imports before using the contextual help.\n",
    "\n",
    "The library is new, and there is still development going on, with still some features in the pipeline (more on the displaying side, auto-complete). For those\n",
    "who enjoy coding, help in improving *GoNB* is very welcome!\n",
    "\n",
    "Finally, there is also the `%help` command, which lists all the currently supported features:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "ba9172b8-ede5-44cd-baa1-a58a1d668a98",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/markdown": [
       "## GoNB Help Page\n",
       "\n",
       "**GoNB** is a Go kernel that compiles and executes on-the-fly Go code.\n",
       "\n",
       "When executing a cell, **GoNB** will save the cell contents (except non-Go commands see\n",
       "below) into a `main.go` file, compile and execute it.\n",
       "\n",
       "It also saves any global declarations (imports, functions, types, variables, constants)\n",
       "and reuse them at the next cell execution -- so you can define a function in one\n",
       "cell, and reuse in the next one. Just the `func main()` is not reused.\n",
       "\n",
       "A `hello world` example would look like:\n",
       "\n",
       "```go\n",
       "func main() {\n",
       "    fmt.Printf(`Hello world!\\n`);\n",
       "}\n",
       "\n",
       "```\n",
       "\n",
       "But to avoid having to type `func main()` all the time, you can use `%%` and everything\n",
       "after is wrapped inside a `func main() { ... }`. \n",
       "So our revised `hello world` looks like:\n",
       "\n",
       "```go\n",
       "%%\n",
       "fmt.Printf(`Hello world!\\n`)\n",
       "\n",
       "```\n",
       "\n",
       "\n",
       "### Init Functions -- `func init()`\n",
       "\n",
       "Since there is always only one definition per function name, it's not possible for\n",
       "each cell to have its own init() function. \n",
       "Instead, **GoNB** converts any function named `init_something()` to `init()` before \n",
       "compiling and executing. \n",
       "This way each cell can create its own `init_...()` and have it called at every cell execution.\n",
       "\n",
       "\n",
       "### Special non-Go Commands\n",
       "\n",
       "- `%% [<args...>]` or `%main [<args...>]`: Marks the lines as follows to be wrapped in a `func main() {...}` during\n",
       "  execution. A shortcut to quickly execute code. It also automatically includes `flag.Parse()`\n",
       "  as the very first statement. Anything after`%%` or `%main` are taken as arguments\n",
       "  to be passed to the program -- it resets previous values given by `%args`.\n",
       "- `%args <args...>`: Sets arguments to be passed when executing the Go code. This allows one to\n",
       "  use flags as a normal program. Notice that if a value after `%%` or `%main` is given, it will\n",
       "  overwrite the values here.\n",
       "- `%exec <my_func> [<args...>]`: this will call the function `my_func()`, and optionally set the program arguments.\n",
       "  Behind the scenes it creates a trivial `func main()` that parses the flags and calls `my_func()` (without any\n",
       "  parameters or return values).\n",
       "- `%autoget` and `%noautoget`: Default is `%autoget`, which automatically does `go get` for\n",
       "  packages not yet available.\n",
       "- `%cd [<directory>]`: Change current directory of the Go kernel, and the directory from where\n",
       "  the cells are executed. If no directory is given it reports the current directory.\n",
       "- `%env VAR value`: Sets the environment variable VAR to the given value. These variables\n",
       "  will be available both for Go code and for shell scripts.\n",
       "- `%goflags <values...>`: Configures list of extra arguments to pass to `go build` when compiling the\n",
       "  code for execution of a cell.\n",
       "  If no values are given, it simply shows the current setting.\n",
       "  To reset its value, use `%goflags \"\"\"`.\n",
       "  See example on how to use this in the [tutorial](https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb). \n",
       "- `%with_inputs`: will prompt for inputs for the next shell command. Use this if\n",
       "  the next shell command (`!`) you execute reads the stdin. Jupyter will require\n",
       "  you to enter one last value after the shell script executes.\n",
       "- `%with_password`: will prompt for a password passed to the next shell command.\n",
       "  Do this is if your next shell command requires a password.\n",
       "- `%capture [-a] <file_path>` will make a copy of all **cell execution output** to the given file. By default\n",
       "  it overwrites the file contents each time the cell is executed. Use `-a` instead to append to the file.\n",
       "  It works only for the current cell. See also `%%writefile` to write files with a specific content.\n",
       "  It doesn't work with `%wasm` cells.\n",
       "- `%version` prints out **GoNB**'s version.\n",
       "\n",
       "**Notes**: \n",
       "\n",
       "1. The special commands below can be used in the start of the line as is, or prefixed by a `//gonb:`, which may be easier\n",
       "on some IDEs if editing the code externally (since these special commands are not proper Go). \n",
       "So `//gonb:%%` is the same as `%%` \n",
       "2. All these commands are executed **before** any Go code in the same cell.\n",
       "\n",
       "\n",
       "### Managing Memorized Definitions\n",
       "\n",
       "- `%list` (or `%ls`): Lists all memorized definitions (imports, constants, types, variables and\n",
       "  functions) that are carried from one cell to another.\n",
       "- `%remove <definitions>` (or `%rm <definitions>`): Removes (forgets) given definition(s). Use as key the\n",
       "  value(s) listed with `%ls`.\n",
       "- `%reset [go.mod]` clears all memorized definitions (imports, constants, types, functions, etc.)\n",
       "  as well as re-initializes the `go.mod` file. \n",
       "  If the optional `go.mod` parameter is given, it will re-initialize only the `go.mod` file -- \n",
       "  useful when testing different set up of versions of libraries.\n",
       "\n",
       "\n",
       "### Executing Shell Commands\n",
       "\n",
       "- `!<shell_cmd>`: executes the given command on a new shell. It makes it easy to run\n",
       "  commands on the kernels box, for instance to install requirements, or quickly\n",
       "  check contents of directories or files. Lines ending in `\\` are continued on\n",
       "  the next line -- so multi-line commands can be entered. But each command is\n",
       "  executed in its own shell, that is, variables and state is not carried over.\n",
       "- `!*<shell_cmd>`: same as `!<shell_cmd>` except it first changes directory to\n",
       "  the temporary directory used to compile the go code -- the latest execution\n",
       "  is always saved in the file `main.go`. It's also where the `go.mod` file for\n",
       "  the notebook is created and maintained. Useful for manipulating `go.mod`,\n",
       "  for instance to get a package from some specific version, something\n",
       "  like `!*go get github.com/my/package@v3`.\n",
       "\n",
       "Notice that when the cell is executed, first all shell commands are executed, and only after that, if there is\n",
       "any Go code in the cell, it is executed.\n",
       "\n",
       "### Running a Debugger\n",
       "\n",
       "While **GoNB** doesn't (yet) talk the debug protocol with JupyterLab, it's easy to start a GUI debugger\n",
       "from a cell, if being executed on the same machine as the browser.\n",
       "\n",
       "The common Go debugger recommendation is [delve](https://github.com/go-delve/delve), and in particular its front-end\n",
       "[gdlv](https://github.com/aarzilli/gdlv). And to make it simpler **GoNB** includes a small wrapper script \n",
       "[`ndlv`](https://github.com/janpfeifer/gonb/blob/main/cmd/ndlv/ndlv) to\n",
       "set the directory and program name to the last cell executed. Copy or link that script somewhere in your `PATH`\n",
       "(maybe `${HOME}/bin` if you have such directory set up).\n",
       "\n",
       "To open the debugger, after executing a cell you want to debug, you create and execute a new cell with this single shell command:\n",
       "\n",
       "```\n",
       "!ndlv\n",
       "```\n",
       "\n",
       "### Tracking of Go Files In Development:\n",
       "\n",
       "A convenient way to develop programs or libraries in **GoNB** is to use replace\n",
       "rules in **GoNB**'s `go.mod` to your program or library being developed and test\n",
       "your program from **GoNB** -- see the \n",
       "[Tutorial]((https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb))'s\n",
       "section \"Developing Go libraries with a notebook\" for different ways of achieving this.\n",
       "\n",
       "To manipulate the list of files tracked for changes:\n",
       "\n",
       "- `%track [file_or_directory]`: add file or directory to list of tracked files,\n",
       "  which are monitored by **GoNB** (and 'gopls') for auto-complete or contextual help.\n",
       "  If no file is given, it lists the currently tracked files.\n",
       "- `%untrack [file_or_directory][...]`: remove file or directory from list of tracked files.\n",
       "  If suffixed with `...` it will remove all files prefixed with the string given (without the\n",
       "  `...`). If no file is given, it lists the currently tracked files.\n",
       "\n",
       "\n",
       "### Environment Variables\n",
       "\n",
       "For convenience, **GoNB** defines the following environment variables -- available for the shell\n",
       "scripts (`!` and `!*`) and for the Go cells:\n",
       "\n",
       "- `GONB_DIR`: the directory where commands are executed from. This can be changed with `%cd`.\n",
       "- `GONB_TMP_DIR`: the directory where the temporary Go code, with the cell code, is stored\n",
       "  and compiled. This is the directory where `!*` scripts are executed. It only changes when a kernel\n",
       "  is restarted, and a new temporary directory is created.\n",
       "- `GONB_PIPE`: is the _named pipe_ directory used to communicate rich content (HTML, images)\n",
       "  to the kernel. Only available for _Go_ cells, and a new one is created at every execution.\n",
       "  This is used by the `**GoNB**ui`` functions described above, and doesn't need to be accessed directly.\n",
       "- `GONB_VERSION`: Version of this *GoNB* build.\n",
       "- `GONB_GIT_COMMIT`: Git commit hash for this *GoNB* build -- notice it doesn't account for any modifications that\n",
       "  may have been made and not committed.\n",
       "- `GONB_JUPYTER_KERNEL_ID`: the unique id assigned by Jupyter to this kernel.\n",
       "  It's used to build some of the API paths to the JupyterServer.\n",
       "  If it's not set, GoNB was not able to parse it from the kernel file path.\n",
       "- `GONB_JUPYTER_ROOT`: the path to the Jupyter root directory, if GONB managed to read it (depends on the architecture).\n",
       "  This can be used to construct URLs to static file contents (images, javascript, etc.) served by Jupyter: \n",
       "  one can use `src=\"/file/...<path under GONB_JUPYTER_ROOT>...\"`.\n",
       "\n",
       "### Widgets\n",
       "\n",
       "The package `gonbui/widgets` offers widgets that can be used to interact in a more\n",
       "dynamic way, using the HTML element in the browser. E.g.: buttons, sliders.\n",
       "\n",
       "It's not necessary to do anything, but, to help debug the communication system\n",
       "with the front-end, **GoNB** offers a couple of special commands:\n",
       "\n",
       "- `%widgets` - install the javascript needed to communicate with the frontend.\n",
       "  This is usually not needed, since it happens automatically when using Widgets.\n",
       "- `%widgets_hb` - send a _heartbeat_ signal to the front-end and wait for the\n",
       "  reply.\n",
       "  Used for debugging only.\n",
       "\n",
       "### Writing for WASM (WebAssembly) (Experimental)\n",
       "\n",
       "**GoNB** can also compile to WASM and run in the notebook. This is experimental, and likely to change\n",
       "(feedback is very welcome), and can be used to write interactive widgets in Go, in the notebook.\n",
       "\n",
       "When a cell with `%wasm` is executed, a temporary directory is created under the Jupyter root directory\n",
       "called `jupyter_files/<kernel unique id>/` and the cell is compiled to a wasm file and put in that \n",
       "directory.\n",
       "\n",
       "Then **GONB** outputs the javascript needed to run the compiled wam.\n",
       "\n",
       "In the Go code, the following extra constants/variables are created in the global namespace, and can be used\n",
       "in your Go code:\n",
       "\n",
       "- `GonbWasmDir`, `GonbWasmUrl`: the directory and url (served by Jupyter) where the generated `.wasm` files are read.\n",
       "  Potentially, the user can use it to serve other files.\n",
       "  These are unique for the kernel, but shared among cells.\n",
       "- `GonbWasmDivId`: When a `%wasm` cell is executed, an empty `<div id=\"<unique_id>\"></div>`\n",
       "  is created with a unique id -- every cell will have a different one.\n",
       "  This is where the Wasm code can dynamically create content.\n",
       "\n",
       "The following environment variables are set when `%wasm` is created:\n",
       "\n",
       "- `GONB_WASM_SUBDIR`, `GONB_WASM_URL`: the directory and url (served by Jupyter) where the generated `.wasm` files are read.\n",
       "  Potentially, the user can use it to serve other files.\n",
       "  These environment variables are available for shell scripts (`!...` and `!*...` special commands) and non-wasm \n",
       "  programs if they want to serve different files from there.\n",
       "\n",
       "\n",
       "### Writing Tests and Benchmarks\n",
       "\n",
       "If a cell includes the `%test` command (anywhere in cell), it is compiled with `go test`\n",
       "(as opposed to `go build`).\n",
       "This can be very useful both to demonstrate tests, or simply help develop/debug them in a notebook.\n",
       "\n",
       "If `%test` is given without any flags, it uses by default the flags `-test.v` (verbose) and `-test.run` defined\n",
       "with the list of the tests defined in the current cell. \n",
       "That is, it will run only the tests in the current cell. \n",
       "Also, if there are any benchmarks in the current cell, it appends the flag `-test.bench=.` and runs the benchmarks\n",
       "defined in the current cell.\n",
       "\n",
       "Alternatively one can use `%test <flags>`, and the `flags` are passed to the binary compiled with `go test`. \n",
       "Remember that test flags require to be prefixed with `test.`. \n",
       "So for a verbose output, use `%test -test.v`. \n",
       "For benchmarks, run `%test -test.bench=. -test.run=Benchmark`. \n",
       "\n",
       "See examples in the [`gotest.ipynb` notebook here](https://github.com/janpfeifer/gonb/blob/main/examples/tests/gotest.ipynb).\n",
       "\n",
       "\n",
       "### Cell Magic\n",
       "\n",
       "The following are special commands that change how the cell is interpreted, so they are prefixed with `%%` (two '%'\n",
       "symbols). They try to follow [IPython's Cell Magic](https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics).\n",
       "\n",
       "They must always appear as the first line of the cell.\n",
       "\n",
       "The contents in the cells are not assumed to be Go, so auto-complete and contextual help are disabled in those cells.\n",
       "\n",
       "#### `%%writefile`\n",
       "\n",
       "```\n",
       "%%writefile [-a] <filePath>\n",
       "```\n",
       "\n",
       "Write contents of the cell (except the first line with the '%%writefile') to the given `<filePath>`. If `-a` is given\n",
       "it will append the cell contents to the file.\n",
       "\n",
       "This can be handy if for instance the notebook needs to write a configuration file, or simply to dump the code inside\n",
       "the cell into some file.\n",
       "\n",
       "File path passes through a tilde (`~`) expansion to the user's home directory, as well as environment variable substitution (e.g.: `${HOME}` or `$MY_DIR/a/b`).\n",
       "\n",
       "See also `%capture` to instead write the output of the execution of the cell to a file.\n",
       "\n",
       "### `%%script`, `%%bash` and `%%sh`\n",
       "\n",
       "```\n",
       "%%script <command>\n",
       "```\n",
       "\n",
       "Execute `<command>` and feed it (`STDIN`) with the contents of the cell. The `%%bash` and `%%sh` magic is an alias to `%%script bash` and `%%script sh` respectively.\n",
       "\n",
       "Generally, a convenient way to run larger scripts.\n",
       "\n",
       "\n",
       "### Other\n",
       "\n",
       "- `%goworkfix`: work around 'go get' inability to handle 'go.work' files. If you are\n",
       "  using 'go.work' file to point to locally modified modules, consider using this. It creates\n",
       "  'go mod edit --replace' rules to point to the modules pointed to the 'use' rules in 'go.work'\n",
       "  file.\n",
       "  It overwrites/updates 'replace' rules for those modules, if they already exist. See \n",
       "  [tutorial](https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb) for an example.\n",
       "\n",
       "### Links\n",
       "\n",
       "- [github.com/janpfeifer/gonb](https://github.com/janpfeifer/gonb) - GitHub page.\n",
       "- [Tutorial](https://github.com/janpfeifer/gonb/blob/main/examples/tutorial.ipynb).\n",
       "- [go.dev](https://pkg.go.dev/github.com/janpfeifer/gonb) package reference."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%help"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Go (gonb)",
   "language": "go",
   "name": "gonb"
  },
  "language_info": {
   "codemirror_mode": "",
   "file_extension": ".go",
   "mimetype": "text/x-go",
   "name": "go",
   "nbconvert_exporter": "",
   "pygments_lexer": "",
   "version": "go1.24.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
